servlet实现文件上传、预览、下载、删除功能

  1. 准备工作

首先,在编写servlet实现文件上传、预览、下载、删除功能之前,需要先进行准备工作,包括:

  • 建立一个Web项目
  • 引入相关的jar包,如commons-fileupload.jar、commons-io.jar等
  • 编写一个用于上传文档的html页面
  • 定义文件上传后保存的路径

  • 上传文件

上传文件是整个功能的核心部分,下面是实现文件上传的步骤:

2.1 在html页面中添加文件上传控件

<form method="post" action="uploadFileServlet" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传">
</form>

其中,form的method属性要设为post,action属性要指向实现文件上传功能的servlet,enctype属性必须设置为multipart/form-data,这个属性非常关键,因为默认值的话,浏览器会把文件名当成普通文本提交而不是文件。

2.2 编写servlet

@WebServlet(name = "uploadFileServlet", urlPatterns = {"/uploadFileServlet"})
@MultipartConfig
public class UploadFileServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 获取上传的文件
        Part part = request.getPart("file");
        // 获取文件名
        String fileName = part.getSubmittedFileName();
        // 保存文件到指定路径
        part.write("/upload/" + fileName);

        out.println("上传成功!");
    }
}
  • @WebServlet(name = "uploadFileServlet", urlPatterns = {"/uploadFileServlet"}):定义servlet的名称和处理请求的URL地址
  • @MultipartConfig:使用multipart/form-data编码的表单数据时,需要在servlet上加@MultipartConfig注解,否则在获取上传文件的时候会报NullPointerException。
  • 获取上传的文件:使用HttpServletRequest的getPart方法来获取上传的文件。其中,参数file与html页面中的input标签中的name属性的值相同,即该参数是文件上传控件的name属性的值。
  • 保存上传的文件:使用write方法把上传的文件保存到指定路径。在这里,文件默认保存在Tomcat服务器的根目录的upload文件夹下。

  • 预览文件

预览文件通常是指,用户点击某个按钮或链接后,可以在线浏览指定的文件,比如图片、视频、PDF文件等。下面是实现文件预览的步骤:

3.1 获取上传的文件

预览文件需要先获取上传的文件,获取方式同上。

3.2 添加servlet代码

@WebServlet(name = "previewFileServlet", urlPatterns = {"/previewFileServlet"})
@MultipartConfig
public class PreviewFileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 获取上传的文件
        String fileName = request.getParameter("filename");
        if (fileName == null || "".equals(fileName)) {
            out.println("文件名为空!");
            return;
        }

        // 获取文件的MIME类型
        ServletContext context = getServletContext();
        String mimeType = context.getMimeType(fileName);
        if (mimeType == null) {
            mimeType = "application/octet-stream";
        }

        response.setContentType(mimeType);

        // 设置Content-Disposition以及文件名
        String headerValue = String.format("attachment; filename=\"%s\"", fileName);
        response.setHeader("Content-Disposition", headerValue);

        // 获取文件的输入流
        String filePath = "/upload/" + fileName;
        InputStream in = getClass().getResourceAsStream(filePath);

        // 把输入流写入到输出流中
        OutputStream outStream = response.getOutputStream();
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = in.read(buffer)) != -1) {
            outStream.write(buffer, 0, bytesRead);
        }

        in.close();
        outStream.flush();
        outStream.close();
    }
}

其中,

  • @WebServlet(name = "previewFileServlet", urlPatterns = {"/previewFileServlet"}):定义servlet的名称和处理请求的URL地址
  • 获取上传的文件:使用HttpServletRequest的getParameter方法来获取上传的文件名。
  • 获取文件的MIME类型:使用ServletContext的getMimeType方法获取上传文件的类型。如果无法获取到MIME类型,则设置为"application/octet-stream"。
  • 设置Content-Disposition以及文件名:用于提示浏览器以下载方式打开文件,然后把文件名保存到Content-Disposition中,这样在下载的时候就会默认使用该文件名。
  • 把输入流写入到输出流中:通过 response.getOutputStream() 方法取得 ServletOutputStream 对象,然后使用输入流读取文件内容,并在ServletOutputStream中写入,这样文件内容就输出到浏览器中了。

同时,为了在html页面中能够显示文件预览按钮,可以添加如下代码:

<a href="previewFileServlet?filename=文件名" target="_blank">预览</a>

其中,要将filename参数设置为需要预览文件的文件名,target属性设置为"_blank"以在新窗口打开预览页面。

  1. 下载文件

如果用户需要下载文件,可以通过点击下载按钮或链接来实现。下面是实现文件下载的步骤:

4.1 获取上传的文件

下载文件需要先获取上传的文件,获取方式同上。

4.2 添加servlet代码

@WebServlet(name = "downloadFileServlet", urlPatterns = {"/downloadFileServlet"})
@MultipartConfig
public class DownloadFileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 获取上传的文件
        String fileName = request.getParameter("filename");
        if (fileName == null || "".equals(fileName)) {
            out.println("文件名为空!");
            return;
        }

        // 获取文件的MIME类型
        ServletContext context = getServletContext();
        String mimeType = context.getMimeType(fileName);
        if (mimeType == null) {
            mimeType = "application/octet-stream";
        }

        response.setContentType(mimeType);

        // 设置Content-Disposition以及文件名
        String headerValue = String.format("attachment; filename=\"%s\"", fileName);
        response.setHeader("Content-Disposition", headerValue);

        // 获取文件的输入流
        String filePath = "/upload/" + fileName;
        FileInputStream in = new FileInputStream(filePath);

        // 把输入流写入到输出流中
        OutputStream outStream = response.getOutputStream();
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = in.read(buffer)) != -1) {
            outStream.write(buffer, 0, bytesRead);
        }

        in.close();
        outStream.flush();
        outStream.close();
    }
}

其中,与预览文件的代码基本相同,区别在于设置Content-Disposition的值不同。同样,为了在html页面中能够显示文件下载按钮,可以添加如下代码:

<a href="downloadFileServlet?filename=文件名">下载</a>

其中,filename参数同预览文件一样,设置为需要下载的文件名。

  1. 删除文件

删除文件通常是指,用户选中某个文件后,点击删除按钮,可以删除指定的文件。下面是实现文件删除的步骤:

5.1 获取上传的文件

删除文件需要先获取上传的文件,获取方式同上。

5.2 添加servlet代码

@WebServlet(name = "deleteFileServlet", urlPatterns = {"/deleteFileServlet"})
@MultipartConfig
public class DeleteFileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 获取上传的文件
        String fileName = request.getParameter("filename");
        if (fileName == null || "".equals(fileName)) {
            out.println("文件名为空!");
            return;
        }

        // 删除文件
        String filePath = "/upload/" + fileName;
        File file = new File(getServletContext().getRealPath(filePath));
        if (file.exists()) {
            file.delete();
        }

        out.print("删除成功!");
    }
}

其中,使用File类的delete()方法来删除文件。同样,为了在html页面中能够显示文件删除按钮,可以添加如下代码:

<a href="deleteFileServlet?filename=文件名">删除</a>

其中,filename参数同预览文件一样,设置为需要删除的文件名。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:servlet实现文件上传、预览、下载、删除功能 - Python技术站

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

相关文章

  • Spring boot中Jackson的操作指南

    下面就是关于Spring Boot中Jackson操作的指南详解。 什么是Jackson Jackson是Java应用程序中最常用的JSON处理库之一,它可以将Java对象转换为JSON格式,也能将JSON反序列化为Java对象。 如何在Spring Boot中使用Jackson 在Spring Boot中使用Jackson非常简单。Spring Boot的…

    Java 2023年5月26日
    00
  • 解决Spring Security中AuthenticationEntryPoint不生效相关问题

    当我们在使用Spring Security的时候,有时候可能会遇到AuthenticationEntryPoint不会被自动调用的问题。这个问题的原因可能是我们自定义的AuthenticationEntryPoint没有被正确配置或者是我们没有理解AuthenticationEntryPoint的工作原理。接下来我将为大家提供一个完整攻略,以解决Spring…

    Java 2023年6月3日
    00
  • 浅谈Java多进程程序的运行模式

    下面是“浅谈Java多进程程序的运行模式”的完整攻略。 简介 在Java编程中,多进程程序指的是在一个程序中创建多个进程进行并行处理的程序。多进程程序可以提高程序效率,增加程序的稳定性和可扩展性。本文主要讨论Java多进程程序的运行模式。 Java多进程程序的运行模式 Java多进程程序的运行模式可以分为以下几种: 1. 多进程只读 在这种模式中,多个进程之…

    Java 2023年5月30日
    00
  • Java 数据库连接(JDBC)的相关总结

    Java 数据库连接(JDBC)的相关总结 JDBC 概述 Java 数据库连接(JDBC)是 Java 语言访问关系型数据库的一种标准方法,可以让开发人员使用 Java 语言访问和处理各种类型的关系型数据库。 Java 通过 JDBC 驱动程序接口标准定义了一组 API,开发人员可以使用它连接到各种各样的关系型数据库,如 MySQL、Oracle、Micr…

    Java 2023年5月19日
    00
  • java读取文件内容,解析Json格式数据方式

    Java 读取文件内容并解析 Json 格式数据的方式可以通过 Gson 这个 Google 提供的开源库来实现。 以下是实现步骤: 步骤1:导入Gson库 在 pom.xml 中添加以下依赖: <dependencies> <dependency> <groupId>com.google.code.gson</gr…

    Java 2023年5月20日
    00
  • SpringBoot整合Mybatis与thymleft实现增删改查功能详解

    我会尽可能详细地讲解“SpringBoot整合Mybatis与Thymeleaf实现增删改查功能”的攻略,让您可以轻松实现该功能。 1. 前置条件 在开始之前,确保您已经完成以下准备工作: 安装Java JDK和IDE(如Eclipse、IntelliJ IDEA等) 掌握SpringBoot、Mybatis及Thymeleaf的基础知识 2. 创建Spri…

    Java 2023年5月20日
    00
  • java web实现自动登录功能

    实现自动登录功能的主要思路是利用浏览器的cookie机制。当用户登录成功时,服务器会将用户信息保存为cookie,并设置其过期时间。每次用户访问网站时,浏览器会自动将保存的cookie发送到服务器,从而实现免登录访问。 下面是实现自动登录功能的步骤: 1. 编写登录接口 首先需要编写登录接口,当用户点击登录按钮后,将用户名和密码发送到服务器进行验证。验证通过…

    Java 2023年6月16日
    00
  • 手把手教你SpringBoot过滤器N种注册方式

    手把手教你SpringBoot过滤器N种注册方式 SpringBoot中过滤器(Filter)是一个常用的技术,它可以在执行控制器前或后,对请求或响应进行拦截,完成一些特定的功能,例如安全控制、日志记录和数据的预处理等。在SpringBoot中,有多种方式注册过滤器,下面介绍其中的N种方法: 方式一:通过FilterRegistrationBean注册过滤器…

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