java实现文件上传下载功能

实现文件上传下载功能是一个常见的需求,Java 语言提供了多种方案可以实现该功能,本文将介绍使用 JavaWeb 中的 Servlet、JSP、File API 和 Apache Commons FileUpload 组件来实现文件上传下载功能的完整攻略。

上传文件

一、表单设计

表单需要有一个文件上传类型的 input:

<form action="uploadServlet" method="post" enctype="multipart/form-data">
  <label for="file">选择文件:</label>
  <input type="file" name="file" id="file">
  <button type="submit">提交</button>
</form>

二、上传流程

当用户提交表单之后,Servlet 接收到请求,就可以通过 request.getParameter() 方法获取表单参数,例如表单中的文本框内容,而文件上传的数据是在 request 的输入流中,需要通过 ServletInputStream 进行读取。

Servlet API 已经封装好了读取文件上传数据的方法,可以通过 request.getPart(partName) 获取到上传的数据 Part,通过 Part.write(String fileName) 方法将数据写入到文件中即可。示例代码如下:

List<FileItem> items = new ServletFileUpload(
  new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
  if (!item.isFormField()) {
    String fileName = item.getName();
    InputStream fileContent = item.getInputStream();
    byte[] buffer = new byte[1024 * 8];
    OutputStream outStream = new FileOutputStream(new File(fileName));
    int bytesRead;
    while ((bytesRead = fileContent.read(buffer)) != -1) {
      outStream.write(buffer, 0, bytesRead);
    }
    outStream.close();
  }
}

三、示例代码

@WebServlet("/uploadServlet")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory())
        .parseRequest(request);
    for (FileItem item : items) {
      if (!item.isFormField()) {
        String fileName = item.getName();
        InputStream fileContent = item.getInputStream();
        byte[] buffer = new byte[1024 * 8];
        OutputStream outStream = new FileOutputStream(new File(fileName));
        int bytesRead;
        while ((bytesRead = fileContent.read(buffer)) != -1) {
          outStream.write(buffer, 0, bytesRead);
        }
        outStream.close();
      }
    }
    response.getWriter().write("文件上传成功!");
  }
}

下载文件

一、文件下载流程

文件下载需要通过 response 输出文件内容,并设置 Content-Disposition 定义浏览器是执行还是下载文件。

String fileName = request.getParameter("fileName");
File file = new File(fileName);
response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[1024 * 8];
int bytesRead;
OutputStream os = response.getOutputStream();
while ((bytesRead = is.read(buffer)) != -1) {
  os.write(buffer, 0, bytesRead);
}
os.close();
is.close();

二、示例代码

@WebServlet("/downloadServlet")
public class FileDownloadServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String fileName = request.getParameter("fileName");
    File file = new File(fileName);
    response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
    InputStream is = new FileInputStream(file);
    byte[] buffer = new byte[1024 * 8];
    int bytesRead;
    OutputStream os = response.getOutputStream();
    while ((bytesRead = is.read(buffer)) != -1) {
      os.write(buffer, 0, bytesRead);
    }
    os.close();
    is.close();
  }
}

三、下载链接

<a href="downloadServlet?fileName=xxx">下载文件</a>

上述示例代码中,"xxx" 为文件名,需要替换为实际文件名。

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

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java单例模式的6种实现方式详解

    Java单例模式的6种实现方式详解 前言 单例模式是一种常见的设计模式,它可以保证一个类只有一个实例,并为外界提供唯一的访问入口。在实际开发中,单例模式经常被用于创建一些共享资源的场景,如数据库连接池、线程池等。本文将详细介绍Java中单例模式的六种实现方式。 1. 饿汉式(静态常量) 饿汉式单例模式的实现方式非常简单,就是在类加载的时候立即创建单例对象,因…

    Java 2023年5月18日
    00
  • java DateUtil工具类时间戳类型转换详解

    Java DateUtil工具类时间戳类型转换详解 1. 什么是时间戳? 时间戳(Timestamp)是指格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。感性地理解,时间戳是用来表示一个时间点的数字,可以用于在不同的时间、时区、地点下定位和比较时间。 2. 如何在Java中使用时间戳? Java中可以使用Date、Calendar类来表…

    Java 2023年5月20日
    00
  • Go语言实现遗传算法的实例代码

    针对Go语言实现遗传算法的实例代码,以下是详细攻略: 1. 什么是遗传算法 遗传算法是一种基于进化论思想的优化算法,它最初由John Holland提出。遗传算法不同于传统的算法,传统算法更多的是通过数学计算,寻找满足特定约束条件的局部最优解。而遗传算法更像一种模拟自然界进化的过程,遗传算法是一种无约束优化算法,可以用于求解各种复杂非线性问题。 2. 遗传算…

    Java 2023年5月19日
    00
  • java微信小程序步数encryptedData和开放数据解密的实现

    实现微信小程序用户步数获取需要对用户进行授权获取,获取到用户授权后,可以获取到用户的加密数据,其中包括了微信小程序步数的加密数据。 但是获取到的小程序步数加密数据是按照AES-128-CBC加密方式进行加密的,所以在获取到的加密数据需要进行解密操作,并且需要借助微信开放数据文档提供的解密算法进行解密。 以下是具体的步骤说明: 1. 获取用户授权并获取加密数据…

    Java 2023年5月23日
    00
  • SpringBoot集成Tomcat服务架构配置

    SpringBoot集成Tomcat服务架构配置的攻略包括以下几个步骤: 在pom.xml文件中添加Tomcat依赖,示例代码如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-…

    Java 2023年5月19日
    00
  • Java面向对象程序设计:继承,多态用法实例分析

    Java面向对象程序设计:继承,多态用法实例分析 简介 面向对象程序设计是Java中最重要的编程思想。其中继承和多态是面向对象程序设计中的两大特性。继承和多态的运用可以对代码架构做到高度的灵活和可维护性,是我们编写高质量代码的关键。 继承 继承是Java中面向对象程序设计的核心概念之一。继承可以使我们的代码重用和复用,提高编程效率。在Java中一个类可以继承…

    Java 2023年5月26日
    00
  • Java Runtime Environment怎么安装 JRE安装详细图文教程

    Java Runtime Environment怎么安装 JRE安装详细图文教程 什么是Java Runtime Environment Java Runtime Environment (JRE)是一个程序开发环境,它由包含Java运行时所需的库和系统组件的集合组成。JRE允许用户在电脑上运行Java编写的程序和Applet。 安装Java Runtime…

    Java 2023年5月26日
    00
  • spring boot实现在request里解密参数返回

    接下来我将为你详细讲解“Spring Boot实现在Request里解密参数返回”的完整攻略。在讲解前,我先对该攻略中的几个关键点进行解释: Request:Request是HTTP请求的对象,可以用来获取请求的参数、头信息、请求方法等内容。 解密参数:在网络请求过程中,为了保证传输数据的安全性,往往需要对数据进行加密处理。因此,在接收到数据时需要进行解密操…

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