商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > JSP实现文件上传功能

JSP实现文件上传功能

  发布于2026-07-22 阅读(0)

扫一扫,手机访问

文件上传在Web开发中算是高频需求了,JSP配合Servlet实现时,有几个关键点很容易踩坑。下面就把完整流程拆开来讲,从依赖包到页面再到后台处理,一步步说清楚。

一、准备部分

需要两个JAR包:fileupload.jario.jar。构建好路径后就可以继续了。

JSP实现文件上传功能

二、页面部分

学号:
姓名:
上传照片:

注意:

  1. 文件上传必须用 post 方法,否则 get 方式下传输总量可能超过URL长度限制。
  2. 必须加上 enctype="multipart/form-data" 这个属性,否则文件数据无法正常提交。
  3. 文件选择框要用 type="file"

JSP实现文件上传功能

三、Servlet部分

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);
    }
}

注:

  1. 如果代码中某些类标红且找不到包,可以用 Alt + / 组合键,选择第一个提示项来导入。

JSP实现文件上传功能

  1. Upload 和 Uploadtemp 文件夹默认存放在 Tomcat 对应的项目目录下。每次通过 Eclipse 更新代码,Eclipse 会直接覆盖整个项目,这两个文件夹也会被清掉。建议在 Eclipse 中新建这两个文件夹,或者通过绝对/相对路径存放到其他位置。

  2. 临时文件中的数据保留时间很短,可以加个 sleep 让程序暂停一下观察。即便不写 item.delete(),整个会话结束后临时文件也会被自动删除。

  3. 如果报错找不到文件,优先用 Chrome 等浏览器测试,不要用 Eclipse 自带的浏览器。

本文转载于:https://www.jb51.net/article/221498.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注