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

首先,在编写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实现文件上传、预览、下载、删除功能

基础教程推荐