javaWeb实战教程
2.8 commons-fileupload文件上传
Servlet 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。需要引入的 jar 文件:commons-fileupload-1.3.2
、commons-io-2.4.jar
。
在网站根目录WebContent下新建html:lesson8_fileupload.html,写入一个文件上传的表单:
<form action="Lesson8FileUpload" method="post" enctype="multipart/form-data">
文件1:<input type="file" name="uploadFile1" /><br/>
文件2:<input type="file" name="uploadFile2" /><br/>
姓名:<input type="text" name="username" /><br/>
年龄:<input type="text" name="age" /><br/>
<input type="submit" value="上传" /><br/>
</form>
在cn.funsoftware.Lesson.servlet新建一个类Lesson8FileUpload.java:
@WebServlet("/Lesson8FileUpload")
public class Lesson8FileUpload extends HttpServlet {
@Override
protected void doPost
(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
}
}
先判断提交的表单是不是文件上传类型:
ServletFileUpload.isMultipartContent(request)//判断表单是否是文件上传
配置上传参数:
DiskFileItemFactory factory = new DiskFileItemFactory();// 配置上传参数
新建ServletFileUpload
:
ServletFileUpload fileUpload = new ServletFileUpload(factory);
fileUpload.setHeaderEncoding("utf-8");// 设置编码
将request
交给ServletFileUpload
处理,获得表单数据:
List<FileItem> fileItems = fileUpload.parseRequest(request);
循环遍历fileItems
里的元素,通过fileItem.isFormField()
方法判断参数是文本还是文件,文本的话可以通过getFieldName()
来获得文本名称,getString()
获得文本内容;如果是文件的话,可以使用write()
方法写入文件中。
完整的文件上传代码写在doPost方法内:
if (!ServletFileUpload.isMultipartContent(request)) {
response.getOutputStream().write("不是文件上传表单".getBytes());
return;
}
// 配置上传参数
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
fileUpload.setHeaderEncoding("utf-8");// 设置编码
try {
List<FileItem> fileItems = fileUpload.parseRequest(request);
if (fileItems == null) {
response.getOutputStream().write("表单里没有上传任何文件".getBytes());
return;
}
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()) {// 是文本
System.out.println(fileItem.getFieldName() + ":" + fileItem.getString());
} else {// 是文件
String uploadPath = request.getServletContext().getRealPath("./") + File.separator
+ "upload";
// 如果目录不存在则创建
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
String fileName = new File(fileItem.getName()).getName();
String filePath = uploadPath + File.separator + fileName;
File storeFile = new File(filePath);
// 在控制台输出文件的上传路径
System.out.println(filePath);
// 保存文件到硬盘
fileItem.write(storeFile);
System.out.println("文件"+fileItem.getFieldName()+"上传成功");
}
}
} catch (Exception e) {
e.printStackTrace();
}