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日

相关文章

  • 实例讲解Java的Spring框架中的控制反转和依赖注入

    下面就来详细讲解下实例讲解Java的Spring框架中的控制反转和依赖注入的攻略: 控制反转(IoC) 控制反转是 Spring 框架的核心原则之一,它实现了松耦合的 Java 代码。控制反转的本质可以理解为:将对象创建、组装、管理的控制权交给 Spring 容器,而不是代码中硬编码实现。 可以通过以下方式来实现控制反转: 使用构造函数实现依赖注入 使用 s…

    Java 2023年5月19日
    00
  • Java对象转json JsonFormat注解

    Java对象转json是Java中很常见的操作,而JsonFormat注解可以对对象中的日期字段进行格式化。下面就来详细讲解这个过程,并附带两个示例说明。 Java对象转json Java对象转json可以使用很多第三方工具库,如fastjson、Jackson、Gson等等。对于这里的讲解,我们以Jackson为例。 步骤 引入Jackson库,可以通过M…

    Java 2023年5月26日
    00
  • 详解java调用python的几种用法(看这篇就够了)

    下面是详解java调用python的几种用法的完整攻略。 1. 使用ProcessBuilder调用python ProcessBuilder可以通过指定命令行的方式启动子进程。因此使用ProcessBuilder可以很方便地调用python脚本,下面是示例代码: import java.io.*; public class CallPythonProces…

    Java 2023年5月23日
    00
  • 解决RestTemplate 的getForEntity调用接口乱码的问题

    RestTemplate是Spring框架提供的用于进行HTTP请求的工具,但是在使用getForEntity方法调用接口时,会出现中文乱码的问题。 解决这个问题可以分为两个步骤: 设置RestTemplate的编码方式 在使用RestTemplate的时候,需要设置它的编码方式。可以在创建RestTemplate对象时,传入一个StringHttpMess…

    Java 2023年5月20日
    00
  • 浅谈Java中FastJson的使用

    浅谈Java中FastJson的使用 什么是FastJson FastJson 是一个 Java 语言编写的高性能 JSON 处理器,但不仅仅是一个 JSON 库。它采用了一种名为 递归下降 的方式来实现 JSON 的解析,因此它的性能非常快。 在Java中,使用FastJson可以很方便地将java对象序列化与反序列化成json格式的字符串,支持按需解析,…

    Java 2023年5月26日
    00
  • Android笔记之:CM9源码下载与编译的应用

    Android笔记之:CM9源码下载与编译的应用攻略 前言 本篇攻略旨在介绍如何下载和编译基于CM9的Android系统源代码,涵盖了代码下载、环境搭建、编译及常见问题解决等内容,适用于Android开发者和爱好者。 步骤一:源码下载 安装必要的软件:Git和repo。 Git是一个版本控制工具,repo是谷歌提供的用于管理大型代码库的脚本。 “`shel…

    Java 2023年5月26日
    00
  • MyBatis逆向⼯程的生成过程

    下面我将为你详细讲解”MyBatis逆向工程的生成过程”的完整攻略。 1. 确定逆向工程生成的目标文件 逆向工程是根据数据库中的表自动生成基于MyBatis框架的Java代码。因此,在进行逆向工程之前,我们需要先确定逆向工程生成的目标文件,包括要使用哪个数据库、要生成哪些表的代码等。 2. 配置逆向工程的生成参数 在进行逆向工程之前,我们需要先配置生成参数。…

    Java 2023年5月20日
    00
  • 详解Spring Boot应用的启动和停止(start启动)

    Spring Boot应用的启动和停止是开发Spring Boot应用的基础,以下是详解Spring Boot应用的启动和停止的完整攻略: 1. Spring Boot应用的启动 Spring Boot应用的启动过程可以分为以下几个步骤: 1.1 加载配置文件 Spring Boot应用启动时会加载application.properties或applica…

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