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

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实现文件上传,可多文件上传示例 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 解决Spring或SpringBoot开启事务以后无法返回自增主键的问题

    在Spring或Spring Boot应用程序中,如果开启了事务,那么在执行插入操作时,无法返回自增主键。这是因为在事务中,插入操作并没有真正地提交到数据库中,因此无法获取自增主键。在本文中,我们将介绍如何解决这个问题,并提供两个示例说明。 解决方案 要解决这个问题,我们可以使用JDBC的KeyHolder接口来获取自增主键。KeyHolder接口是Spri…

    Java 2023年5月18日
    00
  • Java核心教程之常见时间日期的处理方法

    Java核心教程之常见时间日期的处理方法 介绍 在Java编程中,处理时间与日期是常见的任务。Java提供了多种处理时间与日期的方式,本文将介绍常见的时间与日期的处理方法及其实现。 Date类 Java中最基础的日期类型是Date类。Date类表示的是从Java纪元以来的毫秒数,可以用来描述一个时间点。Date类提供了很多方法,如getYear()、getM…

    Java 2023年5月20日
    00
  • IDEA 中使用 ECJ 编译出现 java.lang.IllegalArgumentException的错误问题

    首先,我们需要了解什么是ECJ。ECJ(Eclipse Compiler for Java)是一款基于Eclipse平台的Java编译器,它可以用于将Java代码编译成字节码。而IDEA是一款广受欢迎的Java开发工具,它可以集成ECJ编译器,来编译Java代码。如果在IDEA中使用ECJ编译出现了java.lang.IllegalArgumentExcep…

    Java 2023年5月26日
    00
  • jsp留言板源代码三: 给jsp初学者.

    标题: JSP留言板源代码三: 给JSP初学者的攻略 1. JSP留言板源代码三简介 该源代码是一个基于JSP和Servlet技术实现的留言板网站。本攻略主要面向JSP初学者,介绍留言板的基本框架和关键实现细节。 2. 源代码结构简介 源代码结构如下: +—WEB-INF | +—classes | | +—com | | \—example…

    Java 2023年6月15日
    00
  • Java 通过mave命令下载jar包的示例代码

    当需要使用 Maven 管理 Java 项目的依赖时,通常需要通过 Maven 命令下载 jar 包文件。下面是操作步骤: 安装 Maven 首先需要安装 Maven 工具。这里假设您已经安装了 Maven。 步骤一:创建项目 首先创建一个基于 Maven 的 Java 项目。可以使用 Eclipse 或 Intellij IDEA 等集成开发环境创建。 步…

    Java 2023年5月20日
    00
  • 总结Java的Struts框架的异常处理方法

    总结Java的Struts框架的异常处理方法 异常的概念 在编程中,异常是指在程序运行过程中出现的非正常情况,如空指针异常、数组下标越界等,这些都是我们应该预先处理的一种情况,而不是让程序崩溃或产生其他问题。 Struts框架中的异常处理 在Struts框架中,异常处理很重要,因为在处理用户请求时可能会出现错误,需要在错误发生时对其进行处理。以下是Strut…

    Java 2023年5月20日
    00
  • 浅析JDK和Tomcat的安装与配置方法

    浅析JDK和Tomcat的安装与配置方法 1. JDK的安装与配置 1.1 下载JDK JDK是Java Development Kit的简称,是Java开发所必须的环境。在安装JDK之前,需要先官网上下载JDK安装包。 示例1: 下载JDK 8.0 for Windows x64安装包 1.2 安装JDK 安装JDK的过程与一般软件的安装过程类似,运行安装…

    Java 2023年5月19日
    00
  • java 数组越界判断和获取数组长度的实现方式

    Java 数组越界判断和获取数组长度的实现方式是每个 Java 开发者都需要掌握的重要知识点。接下来,我将详细讲解实现这些功能的方式和注意事项。 数组越界判断 数组越界是指当程序尝试访问一个超出数组边界的元素时产生的错误。Java 中提供了两种方式来避免数组越界: 方式一:使用 try-catch 语句 在 Java 中,我们可以使用 try-catch 语…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部