Servlet实现文件上传,可多文件上传示例

Servlet是Java Web开发中非常常用的技术,它可以实现各种业务需求。其中,文件上传就是Web开发中非常常见的需求之一。

Servlet实现文件上传

Servlet是Java Web开发中非常常用的技术,它可以实现各种业务需求。其中,文件上传就是Web开发中非常常见的需求之一。

本文将详细讲解如何通过Servlet实现文件上传功能,并提供多文件上传的示例说明。

实现步骤:

  1. 在JSP页面中添加文件上传标签,如下所示:
<form action="upload" method="post" enctype="multipart/form-data">
   <input type="file" name="file"><!--单文件上传-->
   <input type="file" name="files" multiple><!--多文件上传-->
   <input type="submit" value="上传"/>
</form>

注意:enctype 属性必须设为 multipart/form-data,否则上传功能无法正常使用。

  1. 在Servlet中获取上传的文件,如下所示:
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    //获取上传的文件
    Part filePart = request.getPart("file");
    Collection<Part> fileParts = request.getParts("files");
}
  1. 对上传的文件进行保存操作,如下所示:
String fileName = getSubmittedFileName(filePart);//获取文件名
InputStream fileContent = filePart.getInputStream();//获取文件内容

String fileNamePrefix = "my_file";//文件名前缀
String uploadPath = "D:\\upload";//上传路径
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
    uploadDir.mkdirs();//如果路径不存在,则创建
}
String filePath = uploadDir.getAbsolutePath() + File.separator + fileNamePrefix + "_" + fileName;//保存文件路径
File file = new File(filePath);
file.createNewFile();//创建文件

OutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = fileContent.read(buffer)) != -1) {
    outputStream.write(buffer, 0, bytesRead);//写文件
}
outputStream.close();//关闭输出流
fileContent.close();//关闭文件内容流
  1. 返回上传结果,如下所示:
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("上传成功!");
out.flush();
out.close();

多文件上传

如果需要进行多文件上传,只需要稍作修改即可。具体修改如下所示:

  1. 在JSP页面中添加多文件上传标签。
<input type="file" name="files" multiple>
  1. 在Servlet中获取上传的多个文件。
Collection<Part> fileParts = request.getParts("files");
  1. 对每一个文件分别进行保存
for (Part filePart : fileParts) {
    String fileName = getSubmittedFileName(filePart);//获取文件名
    InputStream fileContent = filePart.getInputStream();//获取文件内容

    //以下与单文件上传相同
    String fileNamePrefix = "my_file";//文件名前缀
    String uploadPath = "D:\\upload";//上传路径
    File uploadDir = new File(uploadPath);
    if (!uploadDir.exists()) {
        uploadDir.mkdirs();//如果路径不存在,则创建
    }
    String filePath = uploadDir.getAbsolutePath() + File.separator + fileNamePrefix + "_" + fileName;//保存文件路径
    File file = new File(filePath);
    file.createNewFile();//创建文件

    OutputStream outputStream = new FileOutputStream(file);
    byte[] buffer = new byte[4096];
    int bytesRead = -1;
    while ((bytesRead = fileContent.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);//写文件
    }
    outputStream.close();//关闭输出流
    fileContent.close();//关闭文件内容流
}

示例

以下是一个完整的示例代码:

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        try {
            Collection<Part> fileParts = request.getParts("files");
            for (Part filePart : fileParts) {
                String fileName = getSubmittedFileName(filePart);//获取文件名
                InputStream fileContent = filePart.getInputStream();//获取文件内容

                String fileNamePrefix = "my_file";//文件名前缀
                String uploadPath = "D:\\upload";//上传路径
                File uploadDir = new File(uploadPath);
                if (!uploadDir.exists()) {
                    uploadDir.mkdirs();//如果路径不存在,则创建
                }
                String filePath = uploadDir.getAbsolutePath() + File.separator + fileNamePrefix + "_" + fileName;//保存文件路径
                File file = new File(filePath);
                file.createNewFile();//创建文件

                OutputStream outputStream = new FileOutputStream(file);
                byte[] buffer = new byte[4096];
                int bytesRead = -1;
                while ((bytesRead = fileContent.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);//写文件
                }
                outputStream.close();//关闭输出流
                fileContent.close();//关闭文件内容流
            }
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.print("上传成功!");
            out.flush();
            out.close();
        } catch (IOException | ServletException e) {
            e.printStackTrace();
        }
    }

    private static String getSubmittedFileName(Part part) {
        for (String cd : part.getHeader("content-disposition").split(";")) {
            if (cd.trim().startsWith("filename")) {
                String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
                return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
            }
        }
        return null;
    }
}

总结

通过本文的讲解,我们了解了Servlet实现文件上传的基本思路和操作步骤,同时也提供了多文件上传的示例代码。对于Web开发中文件上传相关的需求来说,这个技能点还是非常实用的。

本文标题为:Servlet实现文件上传,可多文件上传示例

基础教程推荐