在表单中必须有一个上传的控件
<input type="file"/>
因为 GET 方式有请求大小的限制,所以表单的提交方式必须是 POST
<form action="/upload" method="post">
表单默认的编码方式为 application/x-www-form-urlencoded ,应该修改为 multipart/form-data ,以二进制的形式进行数据的传输
<form action="/upload" method="post" enctype="multipart/form-data">
注意:此时 Servlet 中就不能再使用 request对象.getParameter(String name) 来获取请求参数
要实现文件的上传,需要基于以下两种组件的一种:
Apache FileUpload 组件【操作比较复杂】
SmartUpload 组件【操作比较简单,但存在一些问题】
基于 FileUpload 组件使用基于Apache FileUpload上传组件实现文件的上传,步骤:
将必要的 jar 包导入到项目中
commons-fileupload-1.2.2.jar
commons-io-1.4.jar
简单写好 upload.jsp 上传页面:
```
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" %>
文件上传:
```
编写 UploadServlet 处理相关请求:
```java
package servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
}
```
上面已经能实现简单的文件上传功能了,但文件上传有很多需要注意的地方。
缓存大小和临时目录
在上传文件的时候,如果文件过大,而且是将文件放在缓存中,就可能造成内存溢出
默认的缓存大小为 10 kb,临时目录的默认值为 tomcat/temp
解决方案:将操作缓存大小的文件放在服务器的磁盘(临时目录)中,在文件的大小超过设定的缓存大小的时候就会使用到临时目录
// 设置缓存大小 500kb factory.setSizeThreshold(1024*500); // 设置临时目录 factory.setRepository(new File("C:/"));