使用commons-fileupload
1.导入jar包
commons-fileupload-1.2.1.jar 文件上传
commons-io-1.4.jar 它是提供的io工具.
介绍commons-fileupload
它有三个核心
1.DiskFileItemFactory类
2.ServletFileUpload类
3.FileItem
2.快速入门:
1.创建upload2.jsp页面
<form action="${pageContext.request.contextPath}/upload2" method="post" encType="multipart/form-data">
<input type="file" name="f"><br>
<input type="submit" value="上传">
</form>
2.创建Upload2Servlet
1.创建一个DiskFileItemFactory
DiskFileItemFactory factory=new DiskFileItemFactory();
2.创建ServletFileUpload类
ServletFileUpload upload=new ServletFileUpload(factory);
3.解析所有上传数据
List<FileItem> items = upload.parseRequest(request);
3.了遍历items集合,集合中的每一项,就是一个上传数据.
1.isFormField();
2.getFieldName();
返回值String,得到组件名称 <input name="">
3.getName();
返回值是String,得到的是上传文件的名称.
注意:浏览器不同,它们得到的效果不一样。
1.包含全路径名称 例如: C:\Users\Administrator\Desktop\a.txt
2.只包含上传文件名称 例如:a.txt
4.getString();
这个方法可以获取非上传组件的内容,相当于 getParameter方法作用。
如果是上传组件,上传的文件是文本文件,可以获取到文件文件的内容。
但是如果不是文件文件,例如:是一张图片,这样获取合适吗?
5.获取上传文件的内容,保存到服务器端.
item.getInputStream();它是用于读取上传文件内容的输入流.
使用文件复制操作就可以完成文件上传。
IOUtils.copy(item.getInputStream(), fos);
文件上传步骤
- 实现步骤
1、创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
2、使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。
3、调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
4、对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件
-
-
- True 为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值
- False 为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据。
-
package cn.learn.web.servlet;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
public class Upload2Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.创建 DiskFileItemFactory
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2.创建
ServletFileUpload upload = new ServletFileUpload(factory);
try {
// 底层通过request获取数据,进行解析,将解析的数据封装到List<FileItem>
List<FileItem> items = upload.parseRequest(request);
// 3.遍历集合
for (FileItem item : items) {
if (item.isFormField()) {
// 这就是得到了<input type="text" name="content">这样的组件
// String fieldName = item.getFieldName();
// System.out.println(fieldName);
//
// String name = item.getName();
// System.out.println(name);
//
// String msg = item.getString();
// System.out.println(msg);
} else {
// 这就是得到了<input type="file"> 这样的组件.
// String fieldName = item.getFieldName();
// System.out.println("上传组件的名称:" + fieldName);
//
String name = item.getName(); // 上传文件名称
System.out.println(name);
name = name.substring(name.lastIndexOf("\\") + 1);
// System.out.println("上传组件:" + name);
//
// String msg = item.getString();
// System.out.println(msg);
// 获取上传文件内容,完成文件 上传操作
// InputStream is = item.getInputStream();
// byte[] b = new byte[1024];
// int len = -1;
FileOutputStream fos = new FileOutputStream("d:/upload/"
+ name);
// while ((len = is.read(b)) != -1) {
//
// fos.write(b, 0, len);
//
// }
// fos.close();
// is.close();
IOUtils.copy(item.getInputStream(), fos);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}