发布于2026-07-22 阅读(0)
扫一扫,手机访问
文件上传在Web开发中算是高频需求了,JSP配合Servlet实现时,有几个关键点很容易踩坑。下面就把完整流程拆开来讲,从依赖包到页面再到后台处理,一步步说清楚。
需要两个JAR包:fileupload.jar 和 io.jar。构建好路径后就可以继续了。

注意:
post 方法,否则 get 方式下传输总量可能超过URL长度限制。enctype="multipart/form-data" 这个属性,否则文件数据无法正常提交。type="file"。
package webtest;
import ja va.io.File;
import ja va.io.IOException;
import ja va.util.Iterator;
import ja va.util.List;
import ja vax.servlet.ServletException;
import ja vax.servlet.annotation.WebServlet;
import ja vax.servlet.http.HttpServlet;
import ja vax.servlet.http.HttpServletRequest;
import ja vax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class UploadServlet
*/
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");// 请求编码
response.setCharacterEncoding("utf-8");// 响应编码
response.setContentType("utf-8");// 显示编码
boolean isMultipart = ServletFileUpload.isMultipartContent(request);// 判断是否有enctype="multipart/form-data"
if (isMultipart) {
try {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置内存缓冲区大小,超出时写入临时文件 10KB
((DiskFileItemFactory) factory).setSizeThreshold(10240);
// 设置临时文件目录,防止系统空间不足
((DiskFileItemFactory) factory).setRepository(
new File(request.getSession().getServletContext().getRealPath("Uploadtemp")));
// 控制单个文件最大 20KB
upload.setSizeMax(20480);
List items = upload.parseRequest(request);// 解析所有请求字段
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (item.isFormField()) { // 普通字段
String itemName = item.getFieldName();
if (itemName.equals("sno")) {
int sno = -1;
sno = Integer.parseInt(item.getString("utf-8"));
} else if (itemName.equals("sname")) {
String sname = null;
sname = item.getString("utf-8");
} else {
System.out.println("其他字段...");
}
} else { // 文件字段
String fileName = item.getName();// 获取文件名(含路径)
// 判断文件类型
String ext = fileName.substring(fileName.indexOf(".") + 1);
if (!(ext.equals("png") || ext.equals("gif") || ext.equals("jpg"))) {
System.out.println("仅支持png、gif、jpg类型文件");
return;
}
String path = request.getSession().getServletContext().getRealPath("Upload");
File file = new File(path, fileName);
item.write(file);// 写入服务器
System.out.println(fileName + "上传成功");
}
item.delete();// 删除临时文件
}
} catch (FileUploadBase.SizeLimitExceededException e) {
System.out.println("最大20KB");
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
注:
Alt + / 组合键,选择第一个提示项来导入。
Upload 和 Uploadtemp 文件夹默认存放在 Tomcat 对应的项目目录下。每次通过 Eclipse 更新代码,Eclipse 会直接覆盖整个项目,这两个文件夹也会被清掉。建议在 Eclipse 中新建这两个文件夹,或者通过绝对/相对路径存放到其他位置。
临时文件中的数据保留时间很短,可以加个 sleep 让程序暂停一下观察。即便不写 item.delete(),整个会话结束后临时文件也会被自动删除。
如果报错找不到文件,优先用 Chrome 等浏览器测试,不要用 Eclipse 自带的浏览器。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8