Servlet 文件上传


Servlet 文件上传

Servlet 文件上传指的是在 web 应用中,由用户上传自己的文件(如图片、文档等),通过 Servlet 技术将上传的文件保存到服务器的指定目录中。Servlet 文件上传主要使用了 Apache 公司的 Commons FileUpload 框架来实现。

实现步骤

  1. 在表单中添加 enctype=“multipart/form-data” 属性,声明表单数据提交方式为二进制。

    <form method="post" enctype="multipart/form-data" action="uploadServlet">
        <input type="file" name="file"/>
        <input type="submit" value="上传">
    </form>
    
  2. 在 Servlet 中获取上传文件的 ServletInputStream(二进制流数据)并解析。

    String savePath = "D:/upload/";  // 上传文件的保存路径
    File file = null;
    String message = "";
    try {
        // 使用 Apache Commons FileUpload 解析表单数据
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setHeaderEncoding("UTF-8");  // 设置上传文件编码格式
        if(!ServletFileUpload.isMultipartContent(request)){
            // 判断是否上传了文件
            return;
        }
        List<FileItem> list = upload.parseRequest(request);
        for(FileItem item : list){
            if(item.isFormField()){
                // 判断是否是普通表单项
                String fieldName = item.getFieldName();  // 表单项名称
                String value = item.getString("UTF-8");  // 表单项值
            }else{
                // 如果是上传文件项,则需保存文件
                String fileName = item.getName();  // 获取文件名
                fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
                String fileType = fileName.substring(fileName.lastIndexOf("."));
                // 通过 UUID 来生成唯一的文件名
                String saveFileName = UUID.randomUUID().toString().replace("-", "") + fileType;
                file = new File(savePath + saveFileName);
                item.write(file);
            }
        }
        message = "上传成功!";
    } catch (Exception e) {
        message = "上传失败!";
        e.printStackTrace();
    }
    
  3. 将上传文件保存到指定目录,可以使用 IO 流来实现。

文件上传注意事项

  1. 在表单中添加 enctype=“multipart/form-data” 属性,声明表单数据提交方式为二进制。

  2. 如果是上传文件项,则需保存文件,保存文件时可以通过 UUID 来生成唯一的文件名。

  3. 文件的保存路径最好设置在 web 应用以外的目录,防止上传文件导致 web 应用所在的目录被污染。

  4. Commons FileUpload 框架需要在项目中引入 commons-fileupload jar 包,并在 Servlet 中进行相应的 import 操作。

结语

Servlet 文件上传是一项比较复杂的技术,但是实现起来也不难。通过学习和练习,我们可以掌握 Servlet 文件上传的技术,为我们今后开发 web 应用提供更多的功能拓展。