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日

相关文章

  • idea添加数据库图文教程

    接下来我将为您讲解”IDEA添加数据库图文教程”的完整攻略。本攻略分为以下几个步骤: 下载安装MySQL 在IDEA中打开Database工具窗口 添加MySQL驱动程序 添加MySQL数据源 测试连接 打开数据表 示例操作 下面将分别进行详细讲解。 第一步:下载安装MySQL MySQL是一种流行的关系型数据库,您需要将其下载并安装到您的计算机上。您可以在…

    Java 2023年5月20日
    00
  • Java 详解如何获取网络接口信息

    获取网络接口信息是Java程序开发过程中非常常见且重要的需求。Java中可以使用网络接口类(NetworkInterface)获取系统中所有网络接口的信息。下面是获取网络接口信息的攻略。 1.导入jar包 在Java编写获取网络接口信息的程序之前,需要先导入网络接口类的jar包:java.net。 2.获取网络接口信息 要获取系统中所有的网络接口信息,可以使…

    Java 2023年5月20日
    00
  • Java Arrays工具类用法详解

    我来为您详细讲解“Java Arrays工具类用法详解”的完整攻略。 Java Arrays 工具类用法详解 简介 在 Java 中,Arrays 是一个提供了很多操作数组的静态工具类。其提供了一些静态方法,用于对数组进行操作,如排序、搜索、赋值等。本篇攻略将详细介绍 Arrays 的使用方法。 Arrays 类的静态方法 Arrays 类包含了很多静态方法…

    Java 2023年5月26日
    00
  • java调用dll方法总结

    Java调用DLL方法总结 Java调用DLL方法对于一些需要与底层交互或提高性能的项目而言是十分必要的。 因此,本文将详细介绍如何将Java与DLL库相结合,并提供两个示例。 编写JNI接口 Java应用程序中,可以通过 Java Native Interface(JNI)实现调用动态链接库(DLL)的功能。JNI是 Java Development Ki…

    Java 2023年5月19日
    00
  • 解析整合mybatis-spring需要的maven依赖配置问题

    在整合MyBatis和Spring框架时,我们需要使用mybatis-spring库来简化配置和管理MyBatis的SqlSessionFactory。在本文中,我们将介绍如何配置Maven依赖以解析整合mybatis-spring。 增加依赖 首先,我们需要在pom.xml文件中增加mybatis-spring的依赖。下面是一个示例: <depend…

    Java 2023年5月18日
    00
  • rsa加密算法使用示例分享

    RSA加密算法是一种非对称加密算法,它在加密时使用了公钥(public key)和私钥(private key)两把不同的钥匙。公钥可以随意分发,而私钥只有持有者自己知道。本文将为大家详细讲解RSA加密算法的使用示例。 一、生成密钥对 在使用RSA加密算法之前,需要先生成公钥和私钥这两把钥匙。可以通过OpenSSL工具生成: # 生成2048位的RSA密钥对…

    Java 2023年5月19日
    00
  • JAVA简单实现MD5注册登录加密实例代码

    下面是“JAVA简单实现MD5注册登录加密实例代码”的攻略: 1. MD5简介 MD5,全称为Message-Digest Algorithm 5,是一种常用的密码散列函数,可以将任意长度的信息(不限于字符串)映射为一个128位(16字节)的哈希值。通常用于数据完整性校验和密码存储等场合。 2. MD5加密步骤概述 MD5算法分为4步: 填充数据 初始化状态…

    Java 2023年6月15日
    00
  • 详解Java编程中向量(Vector)的应用

    详解Java编程中向量(Vector)的应用 什么是向量(Vector) 向量(Vector)是Java中的一种集合类,它实现了动态数组的数据结构,可以存储任意类型的对象,数组的容量可以根据需要动态增加或减小。 向量的基本用法 使用Java中的向量,首先需要导入java.util.Vector包,在程序中创建向量对象,然后可以利用add()方法将对象添加到向…

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