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日

相关文章

  • JDK的命令详解

    JDK是Java Development Kit的缩写,是Java应用程序开发所必须的软件开发工具包。它包含了Java Runtime Environment(JRE)和一些开发工具,例如编译器、调试器、JavaDoc工具等等。本篇文章将带您深入了解JDK所提供的命令。 安装JDK 在使用JDK的命令前,需要先安装JDK。以下是在Windows系统下安装JD…

    Java 2023年5月23日
    00
  • Java实现的Base64加密算法示例

    好的!本文将为大家详细讲解如何使用Java实现Base64加密算法,包括编写代码和运行示例,让您能够更好地理解这一加密算法。 什么是Base64加密算法? Base64是一种将二进制数据编码成ASCII字符的编码方式,通常用于对二进制数据进行可读、可传输的编码操作。它是一种通过将二进制数据处理成文本格式的方法,不包含加密和解密操作。 Base64编码会将二进…

    Java 2023年5月20日
    00
  • Java定时器Timer简述

    Java定时器(Timer)是Java提供的一种机制,用来执行定时任务。它允许你在一个特定的时间间隔内反复地,或者仅仅是一次性地,执行某个代码段。在本文中,我们将详细讲解Java定时器的使用,包括创建Timer对象、添加任务、设定任务执行间隔等。 创建Timer对象 首先,我们需要创建一个定时器Timer对象。可以使用如下代码来创建: Timer timer…

    Java 2023年6月1日
    00
  • 最新手机号码、电话号码正则表达式

    作为网站作者,在网站上提供合适的正则表达式能够帮助用户更好地填写信息,本文将详细讲解如何编写符合实际需求的最新手机号码、电话号码正则表达式。 最新手机号正则表达式 先介绍最新的中国手机号码格式:手机号码为11位数字,以13、14、15、17、18、19开头。其中,17、19开头是最新的号段。而且还有一些虚拟运营商的号码前缀不在以上号码段中,例如:170等。 …

    Java 2023年5月20日
    00
  • SpringBoot多环境配置教程详解

    SpringBoot多环境配置教程详解 在开发SpringBoot项目时,我们通常需要针对不同的环境进行配置,例如开发环境、测试环境、生产环境等等。本文将详细讲解如何在SpringBoot项目中实现多环境配置。 方法一:使用多个properties/yml文件 我们可以在SpringBoot项目中使用多个properties/yml文件,分别存放不同环境的配…

    Java 2023年5月31日
    00
  • MVC框架自定义实现过程

    MVC框架自定义实现过程 MVC 框架是一种常用的设计模式,它将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。MVC 框架可以帮助我们更好地组织代码,提高代码的可维护性和可扩展性。本文将详细讲解 MVC 框架自定义实现过程,包括 MVC 框架的架构、MVC 框架的实现、MVC 框架的示例等。 MVC 框架的架构 …

    Java 2023年5月18日
    00
  • Maven打包跳过测试的三种方法

    这里提供三种 Maven 打包跳过测试的方法: 方法一:使用 “-DskipTests” 参数 这是打包时常见使用的参数, 可以跳过测试并进行打包。在命令行中使用参数如下: mvn clean package -DskipTests 或者在 pom.xml 文件中的 build 标签中添加如下配置: <build> <plugins>…

    Java 2023年5月19日
    00
  • SpringMVC源码解读之HandlerMapping – AbstractUrlHandlerMapping系列request分发

    简介 在Spring MVC中,HandlerMapping是一个非常重要的组件,它负责将请求分发给对应的处理器。AbstractUrlHandlerMapping是HandlerMapping的一个实现类,它通过URL映射规则来确定请求应该由哪个处理器来处理。本文将详细介绍AbstractUrlHandlerMapping的源码实现,并提供两个示例说明。 …

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