JSP servlet实现文件上传下载和删除

yizhihongxing

下面是详细讲解"JSP Servlet实现文件上传下载和删除"的完整攻略。

一、实现文件上传

1.1 准备工作

在进行文件上传之前,我们需要先准备好上传文件的HTML表单和对应的服务器端处理代码。HTML表单中需要包含文件上传的相关信息。

通常,我们使用enctype="multipart/form-data"来指定表单使用二进制传输数据,使用type="file"的标签来支持文件上传。

1.2 服务器端处理代码

对于文件上传的处理代码,我们通常会使用Apache FileUpload库或者commons-io库中的FileUtils类进行处理。

这里以Apache FileUpload库为例进行讲解。在处理上传文件之前,需要先在pom.xml中添加以下依赖:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

接下来,我们可以使用如下代码来处理文件上传:

package com.example.servlet;

import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 检查是否为文件上传请求
        if (!ServletFileUpload.isMultipartContent(request)) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "上传文件类型不正确");
            return;
        }

        // 创建FileItemFactory及ServletFileUpload对象
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);

        try {
            // 解析文件上传请求
            List<FileItem> items = upload.parseRequest(request);
            for (FileItem item : items) {
                // 如果是文件类型的表单项,则将其保存到服务器上
                if (!item.isFormField()) {
                    String fileName = new File(item.getName()).getName();
                    String filePath = "upload_dir/" + fileName;
                    File storeFile = new File(filePath);
                    item.write(storeFile);
                }
            }
            request.setAttribute("message", "文件上传成功");
        } catch (Exception e) {
            request.setAttribute("message", "文件上传失败:" + e.getMessage());
        }
        request.getRequestDispatcher("result.jsp").forward(request, response);
    }
}

此处的代码逻辑是:

  1. 检查请求是否为文件上传请求;
  2. 创建FileItemFactory和ServletFileUpload对象;
  3. 解析文件上传请求,将上传的文件保存到服务器上;
  4. 通过request.setAttribute()方法设置结果信息,返回result.jsp页面。

在上述代码中,我们将所有上传的文件都保存到了一个名为upload_dir的文件夹中。如果想要实现更高级的功能(例如控制上传文件的大小、文件数量等等),可以查看Apache FileUpload的官方文档。

1.3 示例

以下是一个HTML表单示例,用于向upload.jsp页面上传文件:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>上传文件</title>
  </head>
  <body>
    <form action="UploadServlet" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <input type="submit" value="上传">
    </form>
  </body>
</html>

二、实现文件下载

2.1 准备工作

在进行文件下载之前,我们需要先准备好用于下载的HTML页面和对应的服务器端处理代码。通常,我们使用标签来实现文件的下载功能。

2.2 服务器端处理代码

对于文件下载的处理代码,我们需要在服务器端指定响应头信息,告诉浏览器当前页面所返回的是一个二进制流(即下载文件)。具体实现如下:

package com.example.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class DownloadServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取要下载的文件名
        String fileName = request.getParameter("fileName");
        if (fileName == null || fileName.equals("")) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        // 获取文件路径,将文件作为二进制流返回给浏览器
        String filePath = "upload_dir/" + fileName;
        File downloadFile = new File(filePath);
        FileInputStream inStream = new FileInputStream(downloadFile);
        ServletOutputStream outStream = response.getOutputStream();
        byte[] buffer = new byte[4096];
        int bytesRead = -1;

        response.setContentType("application/octet-stream");
        response.setContentLength((int) downloadFile.length());
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

        while ((bytesRead = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, bytesRead);
        }

        inStream.close();
        outStream.close();
    }
}

在上述代码中,我们首先获取要下载的文件名,然后根据文件名获取文件路径。接着,我们使用ServletOutputStream将文件作为二进制流返回给浏览器。

在返回文件时,我们设置了Content-Disposition响应头信息,指示浏览器将该文件以附件形式下载。同样地,如果想要实现更高级的功能,例如对下载文件进行加密、记录下载日志等,可以根据实际情况进行相应实现。

2.3 示例

以下是一个HTML页面示例,用于下载名为test.zip的文件:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>下载文件</title>
  </head>
  <body>
    <p>请点击下面的链接下载文件:</p>
    <a href="DownloadServlet?fileName=test.zip">test.zip</a>
  </body>
</html>

三、实现文件删除

3.1 准备工作

在进行文件删除之前,我们需要先准备好用于删除的HTML页面和对应的服务器端处理代码。通常,我们使用标签来实现文件的删除功能。

3.2 服务器端处理代码

对于文件删除的处理代码,我们需要在服务器端根据文件名来删除对应的文件即可。代码如下:

package com.example.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;

public class DeleteServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取要删除的文件名
        String fileName = request.getParameter("fileName");
        if (fileName == null || fileName.equals("")) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        String filePath = "upload_dir/" + fileName;
        File file = new File(filePath);
        if (file.exists()) {
            file.delete();
            request.setAttribute("message", "文件删除成功");
        } else {
            request.setAttribute("message", "文件不存在或已删除");
        }
        request.getRequestDispatcher("result.jsp").forward(request, response);
    }
}

在上述代码中,我们首先获取要删除的文件名,然后根据文件名获取文件路径。如果文件存在,则调用file.delete()方法将其删除。最后,我们返回result.jsp页面,并通过request.setAttribute()方法设置结果信息。

3.3 示例

以下是一个HTML页面示例,用于删除名为test.zip的文件:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>删除文件</title>
  </head>
  <body>
    <p>确定要删除test.zip吗?</p>
    <form action="DeleteServlet" method="get">
      <input type="hidden" name="fileName" value="test.zip">
      <input type="submit" value="删除">
    </form>
  </body>
</html>

四、总结

引用一句话,“以上是绝对必须掌握的文件上传与下载的技术,自己可以先手动实现一遍,才能更好的理解学习文中代码”。同时,我们也要提醒读者注意文件安全问题,例如上传恶意脚本、文件覆盖等问题,需要做好相应的信息过滤和安全控制。

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

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

相关文章

  • centos7安装mysql并jdbc测试教程

    下面我就为您讲解“CentOS 7安装MySQL并JDBC测试教程”的完整攻略。 安装MySQL 首先,在CentOS 7上安装MySQL需要使用yum包管理器。 步骤1:添加MySQL Yum Repository MySQL官方提供了MySQL Yum Repository来帮助我们更简便地安装MySQL。 使用下面的命令添加官方仓库: sudo rpm…

    Java 2023年6月16日
    00
  • Java Lambda表达式详解

    Java Lambda表达式详解 什么是Lambda表达式? Lambda表达式是JDK8引入的一种新的语言特性,主要用于简化Java中的匿名内部类的使用。Lambda表达式本质上是一种匿名函数,实现了函数式编程的思想。 Lambda表达式的语法 Lambda表达式的基本语法如下: (parameters) -> expression 或 (param…

    Java 2023年5月20日
    00
  • servlet实现文件上传、预览、下载、删除功能

    准备工作 首先,在编写servlet实现文件上传、预览、下载、删除功能之前,需要先进行准备工作,包括: 建立一个Web项目 引入相关的jar包,如commons-fileupload.jar、commons-io.jar等 编写一个用于上传文档的html页面 定义文件上传后保存的路径 上传文件 上传文件是整个功能的核心部分,下面是实现文件上传的步骤: 2.1…

    Java 2023年6月15日
    00
  • jsp中存取session值简单介绍

    下面我将详细讲解“JSP中存取session值简单介绍”的完整攻略。 什么是Session Session是指服务端保存用户信息的一种机制,它可以用来保存用户登录信息、用户偏好设置、购物车、验证码等应用场景。 在JSP中,通过内置的session对象来存储用户信息,这个对象可以在同一浏览器窗口内的多个请求间共享,在用户关闭浏览器窗口时就会失效。 Sessio…

    Java 2023年6月15日
    00
  • Spring的注解简单介绍

    下面是Spring的注解简单介绍攻略。 一、概述 Spring是一个轻量级的开源Java框架,它可以用来构建企业级应用程序。在Spring框架中,注解是一种非常方便的方式,它可以用来代替一部分繁琐的XML配置工作。通过注解,我们可以更加方便地描述应用程序的组成部分,并且更加简洁明了,提高代码可读性。 二、注解简介 在Spring中,常用的注解包括: 1. @…

    Java 2023年6月15日
    00
  • Java SPI机制原理及代码实例

    Java SPI机制原理及代码实例 SPI全称Service Provider Interface。在Java中,SPI是一种以插件化的方式来实现程序的可扩展性的机制,它允许第三方程序向已有的程序添加功能或者替换原有的功能。 SPI的机制原理 SPI机制的基本原理是,一些具有相同接口的服务类,定义了一组标准与规范,由服务提供者实现,以供调用方调用。调用者通过…

    Java 2023年5月19日
    00
  • Java流程控制语句最全汇总(下篇)

    下面是Java流程控制语句最全汇总(下篇)的详细攻略: 1. continue语句 continue语句用于结束本次循环并跳过剩余循环体内的语句,进入下一次循环。其语法格式为: continue; 示例说明: for(int i=0; i<5; i++){ if(i==2){ continue; } System.out.println(i); } 运…

    Java 2023年5月23日
    00
  • 基于Java中的StringTokenizer类详解(推荐)

    下面是关于“基于Java中的StringTokenizer类详解”的完整攻略。 1. 什么是StringTokenizer类? StringTokenizer类是Java中用来分割字符串的类,它的作用类似于split()方法。使用StringTokenizer类可以将一个字符串按照指定的分隔符进行分割,得到一个包含多个子字符串的字符串数组。 2. Strin…

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