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开发中文件上传相关的需求来说,这个技能点还是非常实用的。

阅读剩余 71%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Servlet实现文件上传,可多文件上传示例 - Python技术站

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

相关文章

  • 【Java】BigDecimal实现加减乘除运算代码

    Java BigDecimal实现加减乘除运算代码 Java中原生数据类型double和float的计算结果不一定准确,在金额等精度要求高的场景下,需要使用BigDecimal类进行运算。 BigDecimal概述 BigDecimal类是一个任意精度的,有符号十进制数的不可变对象,它提供了精确的数值运算。它比基本数据类型double和float更准确。在商…

    Java 2023年5月23日
    00
  • JavaEE简介_动力节点Java学院整理

    JavaEE简介_动力节点Java学院整理 JavaEE(Java Enterprise Edition)是Java SE(Java Standard Edition)的扩展,旨在为企业级应用程序提供支持。其包含许多不同的规范和技术,用于开发和部署企业应用程序。JavaEE应用程序通常运行在JavaEE兼容的应用服务器上,并具有高可用性、可伸缩性和安全性的特…

    Java 2023年5月20日
    00
  • IntelliJ IDEA编译项目报错 “xxx包不存在” 或 “找不到符号”

    下面是 Intellj IDEA 编译项目报错 “xxx包不存在” 或 “找不到符号” 的完整攻略: 1. 确认依赖包已存在 首先,这种报错通常是因为项目所依赖的某个包没有被正确引入或者被 IntelliJ IDEA 项目正确识别,所以我们需要确认所依赖的包已经存在且被正确引入。这个可以通过以下步骤来进行检查: 确认依赖项列表中是否存在该包。可以在 Inte…

    Java 2023年5月26日
    00
  • Apache log4j2-RCE 漏洞复现及修复建议(CVE-2021-44228)

    首先我们来简单介绍一下这个漏洞。 Apache log4j2是一款Java日志框架,它可以帮助开发者进行应用程序日志的记录和管理。CVE-2021-44228是Apache log4j2存在的一种远程代码执行漏洞,攻击者通过恶意构造log4j格式的请求,可以在服务器上执行任意代码,从而造成严重后果。 下面我们来具体讲解一下如何复现这个漏洞,并提供修复建议。 …

    Java 2023年6月2日
    00
  • Java实现分页代码

    下面是Java实现分页代码的完整攻略。 确定分页参数 Java实现分页代码的第一步就是要确定分页参数,常见的分页参数有:当前页码、每页显示的记录数、总记录数、总页数等。 计算总页数 需要先根据每页记录数和总记录数计算出总页数。计算方法是将总记录数除以每页显示的记录数,如果余数大于0,则总页数需要加1。 // 计算总页数 int totalPage = tot…

    Java 2023年5月18日
    00
  • Linux系统下安装三个或者多个tomcat(步骤详细)

    以下是详细讲解“Linux系统下安装三个或者多个tomcat”的完整攻略,包含步骤、示例和注意事项。 步骤一:下载相关软件 首先,在Linux系统中,需要下载安装JDK和tomcat,其中JDK是tomcat的运行环境,JDK和tomcat的版本需要兼容,推荐使用JDK8和tomcat8。你可以到Oracle官网下载JDK和到Apache官网下载tomcat…

    Java 2023年5月19日
    00
  • java实现的MD5摘要算法完整实例

    下面是关于“java实现的MD5摘要算法完整实例”的详细讲解。 什么是MD5摘要算法? MD5是一种常用的哈希算法,用于为任意长度的数据产生一个固定长度的散列值。因为MD5算法的散列值是固定长度的,所以经常用于检验数据的完整性和安全性。MD5算法的散列结果是一个128位的二进制数,通常用一个32位的16进制数表示。 MD5算法实现步骤 MD5算法的计算过程包…

    Java 2023年5月19日
    00
  • java 浅析代码块的由来及用法

    Java 浅析代码块的由来及用法 背景介绍 在Java中,代码块是一段静态或动态语句代码,在执行时会形成一个作用域。根据代码块的位置和声明方式,可以分为实例初始化块、静态初始化块和局部代码块。 实例初始化块 实例初始化块是被定义在类内部,但没有被声明为静态的代码块,可以在创建对象时被调用,用于对对象进行初始化操作。 public class Person {…

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