Java Web实现文件上传和下载接口功能详解

Java Web实现文件上传和下载接口功能详解

一、文件上传接口

1. HTML表单

文件上传的第一步是需要在前端实现一个HTML表单,用户通过这个表单可以上传文件。表单中必须含有一个type为file的input元素,这个元素用来选择文件。

<form action="/upload" method="POST" enctype="multipart/form-data">
    <input type="file" name="file">
    <button type="submit">上传</button>
</form>

2. 后端接收文件

表单提交后需要处理上传文件的接口来接收文件。在Java Web中,通过Servlet来处理HTTP请求是最常见的方式。处理上传文件需要注意的一点是要设置请求编码为multipart/form-data,因为这种编码支持文件上传。HttpServletRequest的getPart() 方法可以获取到表单中提交的所有文件,通过这个方法得到的每个Part对象都可以获取文件名、文件大小和文件内容。

public void doPost(HttpServletRequest request, HttpServletResponse response) {
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    Part part = request.getPart("file");
    String fileName = part.getSubmittedFileName();
    InputStream inputStream = part.getInputStream();
    //处理文件操作
}

3. 文件保存

通过Part对象获取到文件内容后,就可以将文件保存到服务器本地。在保存文件之前,需要检查保存文件的目录是否存在,如果不存在则需要创建。这里以保存到Web应用程序的upload文件夹为例。

public void doPost(HttpServletRequest request, HttpServletResponse response) {
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    Part part = request.getPart("file");
    String fileName = part.getSubmittedFileName();
    InputStream inputStream = part.getInputStream();
    String savePath = request.getServletContext().getRealPath("/") + "upload";
    File fileSaveDir = new File(savePath);
    if (!fileSaveDir.exists()) {
        fileSaveDir.mkdir();
    }
    FileOutputStream outputStream = new FileOutputStream(new File(savePath, fileName));
    byte[] buffer = new byte[1024];
    int len = 0;
    while ((len = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, len);
    }
    outputStream.close();
    inputStream.close();
}

二、文件下载接口

1. 后端接口

文件下载的第一步实现后端下载接口。通过设置response的header头来告知浏览器下载文件,在这里需要设置Content-Disposition和Content-Type两个header头。Content-Disposition表示文件下载时的文件名,而Content-Type表示下载的文件类型。

public void doGet(HttpServletRequest request, HttpServletResponse response) {
    String fileName = "demo.jpg";
    String filePath = request.getServletContext().getRealPath("/") + "upload/" + fileName;
    File file = new File(filePath);
    if (file.exists()) {
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        FileInputStream inputStream = new FileInputStream(file);
        OutputStream outputStream = response.getOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, len);
        }
        outputStream.close();
        inputStream.close();
    }
}

2. 前端页面

在前端页面中添加一个超链接,并且这个链接指向后端下载接口就可以实现文件下载的功能了。在这里,我们以下载图片demo.jpg为例。

<a href="/download" target="_blank">下载图片</a>

示例一:文件上传代码示例

完整代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>文件上传示例</title>
</head>
<body>
    <form action="/upload" method="POST" enctype="multipart/form-data">
        <input type="file" name="file">
        <button type="submit">上传</button>
    </form>
</body>
</html>
public class FileUploadServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        Part part = request.getPart("file");
        String fileName = part.getSubmittedFileName();
        InputStream inputStream = part.getInputStream();
        String savePath = request.getServletContext().getRealPath("/") + "upload";
        File fileSaveDir = new File(savePath);
        if (!fileSaveDir.exists()) {
            fileSaveDir.mkdir();
        }
        FileOutputStream outputStream = new FileOutputStream(new File(savePath, fileName));
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, len);
        }
        outputStream.close();
        inputStream.close();
    }
}

示例二:文件下载代码示例

完整代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>文件下载示例</title>
</head>
<body>
    <a href="/download" target="_blank">下载图片</a>
</body>
</html>
public class FileDownloadServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        String fileName = "demo.jpg";
        String filePath = request.getServletContext().getRealPath("/") + "upload/" + fileName;
        File file = new File(filePath);
        if (file.exists()) {
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            FileInputStream inputStream = new FileInputStream(file);
            OutputStream outputStream = response.getOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, len);
            }
            outputStream.close();
            inputStream.close();
        }
    }
}

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

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

相关文章

  • Java中的8大基本数据类型详解

    Java中的8大基本数据类型详解 在Java中,8大基本数据类型指的是boolean、byte、char、short、int、long、float、double这8种数据类型。它们是Java的基础数据类型,在Java程序中经常被用到。 boolean类型 boolean类型用于存储真假值,取值只有两种:true和false。在Java中,布尔类型的默认值是f…

    Java 2023年5月26日
    00
  • 详解微信小程序开发用户授权登陆

    详解微信小程序开发用户授权登陆 微信小程序开发用户授权登陆是小程序中常见的功能之一,允许用户授权登录并获取用户信息。本攻略将详细介绍如何实现微信小程序用户授权登录,并提供示例代码供参考。 1. 开发者配置 在微信公众平台中注册小程序,并在开发者工具中创建小程序项目。在小程序管理后台中,开启“用户信息”权限,同时设置授权回调页面路径。 2. 获取用户权限 在小…

    Java 2023年5月30日
    00
  • JS求多个数组的重复数据

    如果想要求多个数组中的重复数据,可以使用以下方法: 定义一个函数,接收多个数组作为参数; 对于每个数组,遍历其中的每一个元素,判断该元素在其他数组中是否也存在; 如果其他数组中也存在该元素,则说明该元素是多个数组中的重复数据,将其添加到结果数组中; 返回结果数组。 代码如下: function findDuplicates(…arrays) { cons…

    Java 2023年5月26日
    00
  • springboot项目快速搭建的方法步骤

    下面我会为您详细讲解使用 Spring Boot 快速搭建项目的方法步骤。 准备工作 在开始使用 Spring Boot 快速搭建项目之前,需要准备以下软件: JDK 1.8 或以上版本 Maven 3.x 或以上版本 步骤一:创建Spring Boot项目 使用Spring官方提供的构建工具Spring Initializr,可以快速创建一个 Spring…

    Java 2023年5月15日
    00
  • Java 实战图书管理系统的实现流程

    Java 实战图书管理系统实现流程 本文将给出一个详细的Java 实战图书管理系统实现流程。我们将按照以下五步走进行: 1. 规划 首先我们需要规划我们的图书管理系统将包含哪些功能,这样我们才能更好的开始开发我们的应用程序。我们的规划包括以下几点: 实现基本的图书信息管理功能 包括添加、修改、删除、查询等功能 图书信息应该能方便地导出为Excel文件 实现图…

    Java 2023年5月24日
    00
  • Java 函数编程详细介绍

    Java 函数编程详细介绍 什么是函数编程 函数编程是一种编程范式,它将计算机程序视为数学函数的组合,避免了代码状态的改变和可变数据的使用。函数编程强调函数的纯洁性和不可变性,更关注数据的转换和流,而不只是程序的执行顺序。 Java 中的函数编程 在 Java 中,函数编程由 Lambda 表达式和函数接口的引入开始。Lambda 表达式是一种轻量级的语法,…

    Java 2023年5月23日
    00
  • Java异常处理机制try catch流程详解

    Java异常处理机制try catch流程详解 1. 异常处理机制概述 在Java程序中,当出现异常时,会有异常信息抛出,如果不加以处理,程序可能会出现崩溃等异常情况。因此我们需要加入异常处理机制来避免这些问题的出现。 Java异常处理机制是一种解决异常情况的方式,Java提供了try-catch-finally语句用于异常处理。 2. try-catch-…

    Java 2023年5月27日
    00
  • java数组元素的引用实例讲解

    让我来为你详细讲解一下“Java数组元素的引用实例讲解”。 什么是Java数组元素引用? Java数组数据类型是一种简单的复合类型,用于存储相同数据类型的多个值。Java数组中的元素类似于单独的变量,可以引用或存储任何Java对象,包括数组。Java数组元素的引用是指一种使用数组元素来访问和引用其他Java对象的方法。 Java数组元素引用实例讲解 下面是两…

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