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日

相关文章

  • spirngmvc js传递复杂json参数到controller的实例

    下面是关于“Spring MVC中如何传递复杂JSON参数到Controller”的完整攻略,包含两个示例说明。 Spring MVC中如何传递复杂JSON参数到Controller 在Spring MVC中,我们可以使用AJAX来传递复杂JSON参数到Controller。本文将介绍如何实现这一功能。 示例1:使用@RequestBody注解 1. 编写前…

    Java 2023年5月17日
    00
  • Java中流的有关知识点详解

    下面就来详细讲解Java中流的有关知识点。 流的概念 Java中的流(Stream)是指一系列有序的字节或字符,以特定的方式从源(输入流)或到目的地(输出流)传输(I/O流即Input/Output Stream)。流的本质是对数据传输的抽象。Java中的流主要分为字节流和字符流。 字节流 字节流是以字节为单位进行读写操作,主要有InputStream和Ou…

    Java 2023年5月26日
    00
  • java基础-数组扩容详解

    Java基础-数组扩容详解 什么是数组扩容 在Java中,数组是一个固定长度的数据结构。当我们在使用数组时,如果需要添加更多的元素,则需要声明一个新的数组并复制所有旧元素到新数组中。这个过程称为“数组扩容”。 在Java中,数组扩容是自动完成的。当我们向一个已经装满元素的数组中添加新元素时,系统会自动创建一个新的数组,并将旧元素复制到新数组中。这个过程对用户…

    Java 2023年5月26日
    00
  • 关于struts2中Action名字的大小写问题浅谈

    下面是关于 struts2 中 Action 名字的大小写问题的攻略: 问题描述 在 struts2 的配置文件中,Action 的名字可以大小写混用,例如: <action name="Index" class="com.example.IndexAction"> <result>/index…

    Java 2023年5月20日
    00
  • 简单实现java上传图片文件功能

    下面是详细讲解“简单实现Java上传图片文件功能”的完整攻略。 1. 确认技术栈 在开始实现上传图片文件功能之前,需要确认一下使用的技术栈。Java Web 应用的上传图片文件功能通常包含以下几个技术: HTML 表单:用于用户在浏览器中选择图片文件并提交到服务器。 Servlet:处理浏览器的请求,获取前台提交的文件数据。 文件存储:将上传的文件保存到服务…

    Java 2023年5月26日
    00
  • struts中动态方法调用使用通配符

    在Struts框架中,可以通过动态方法调用使用通配符的方式,实现对请求URL的自动解析,从而找到对应的Action类及其方法进行处理。 以下是使用通配符的完整攻略: 1. 配置struts.xml 在struts.xml中,可以配置动态方法调用的命名空间及通配符等参数。如下所示: <package name="example" na…

    Java 2023年5月20日
    00
  • Java中关于子类覆盖父类的抛出异常问题

    Java中的异常处理机制是一个很重要的特性,可以帮助开发者更好的处理程序运行过程中可能出现的异常情况,使程序更加健壮和稳定。在子类覆盖父类的方法时,如果子类方法抛出的异常类型与父类方法不同,就会产生编译错误。本文将详细介绍Java中关于子类覆盖父类的抛出异常问题,并提供两个示例说明。 1. 子类覆盖父类抛出异常类型必须兼容 子类覆盖父类的方法时,抛出的异常类…

    Java 2023年5月27日
    00
  • 详解springMVC两种方式实现多文件上传及效率比较

    详解 Spring MVC 两种方式实现多文件上传及效率比较 本文将详细讲解 Spring MVC 两种不同的实现多文件上传的方式,并对其效率进行比较。示例代码为基于 Maven 的 Spring MVC 项目。 前置条件 JDK 1.8 或以上版本 Maven Servlet 3.0 或以上版本 Spring MVC 4.3 或以上版本 两种上传方式 Sp…

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