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日

相关文章

  • Spring Data JPA注解Entity使用示例详解

    Spring Data JPA注解Entity使用示例详解 本文将详细介绍Spring Data JPA注解Entity的使用方法,包括如何定义实体类、如何使用注解配置实体类以及实现一些基本的CRUD操作。下文将通过两个示例演示Spring Data JPA注解Entity的使用方法。 示例一:定义实体类 定义实体类是Spring Data JPA的第一步,…

    Java 2023年6月2日
    00
  • 详解@ConfigurationProperties实现原理与实战

    详解@ConfigurationProperties实现原理与实战 什么是@ConfigurationProperties @ConfigurationProperties是Spring Boot提供的一种基于类型安全的配置方式。它可以方便地将properties文件中的属性映射到Java Bean中。可以通过@ConfigurationProperties…

    Java 2023年6月16日
    00
  • Java中Lambda表达式的使用详解

    Java中Lambda表达式的使用详解 Lambda表达式是JDK8引入的一个新特性,它可以让Java程序员写出更简洁、更易读、更灵活的代码。本文将详细讲解Java中Lambda表达式的用法。 什么是Lambda表达式 Lambda表达式是一种匿名函数,它可以作为方法参数传递给其他方法,也可以作为返回值返回给调用方。Lambda表达式的语法如下: (参数列表…

    Java 2023年5月26日
    00
  • Android NDK 开发教程

    Android NDK 开发教程 什么是 Android NDK Android NDK 全称 Native Development Kit,是 Android 官方提供的一个工具集,可用于加速使用 C/C++ 语言编写的应用程序的开发和性能优化。 使用 NDK 进行开发的主要优势在于: 提高了应用程序的性能:使用原生 C/C++ 代码编写可以实现更快的执行…

    Java 2023年5月26日
    00
  • Java(springboot) 读取txt文本内容代码实例

    下面是关于”Java(springboot) 读取txt文本内容代码实例”的完整攻略: 1. 准备工作 在开始实际操作之前,请确保你已经按照以下步骤准备就绪: 已安装好springboot 已经找到要读取的txt文件,并将其放置于项目的资源文件夹中 2. 代码实现 2.1. 读取文件内容到String import org.springframework.c…

    Java 2023年5月19日
    00
  • Spring Boot实现热部署的五种方式

    以下是详细讲解“Spring Boot实现热部署的五种方式”的完整攻略: 1.使用spring-boot-devtools Spring Boot提供了spring-boot-devtools工具让我们实现热部署。只需要将依赖添加到pom.xml文件中即可。 示例代码如下: 1.添加依赖 <dependency> <groupId>o…

    Java 2023年5月19日
    00
  • 详解使用Jenkins部署Spring Boot项目

    我们来详细讲解下如何使用Jenkins部署Spring Boot项目吧。 1. 准备工作 首先,我们需要安装好Jenkins和Java环境,并确保Jenkins服务启动正常。 然后,我们需要在Jenkins中安装相关的插件,如Git插件、Maven插件、Deploy to Container插件等。这些插件可以协助我们实现自动化部署。 最后,我们需要准备好我…

    Java 2023年5月20日
    00
  • string类和LocalDateTime的相互转换方式

    下面是详细讲解“string类和LocalDateTime的相互转换方式”的完整攻略。 string类和LocalDateTime的相互转换方式 在Java编程中,因为工作所需,我们经常需要将String类型的数据和LocalDateTime类型的数据进行相互转换。在这里,我将为大家介绍基于Java8的两种常用的字符串与LocalDateTime之间的相互转…

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