详解SpringBoot下文件上传与下载的实现

详解SpringBoot下文件上传与下载的实现

文件上传

在SpringBoot中,我们可以通过MultipartFile类型的参数来实现文件上传。步骤如下:

  1. 在前端,添加一个文件的input框,并设置为type="file"
<form action="/upload" method="post" enctype="multipart/form-data">
  <input type="file" name="file"/>
  <button type="submit">上传</button>
</form>
  1. 在后端的Controller中,定义一个接收文件的方法,并使用@RequestParam("file") MultipartFile file来接收文件。
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    // do something with the file
    return "success";
}
  1. 接收文件后,我们可以通过MultipartFile的方法来获得文件的相关信息,如文件名、大小等,并保存文件。
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    String fileName = file.getOriginalFilename();
    long fileSize = file.getSize();
    // 保存文件
    File destFile = new File("/path/to/save/" + fileName);
    try {
        file.transferTo(destFile);
    } catch (IOException e) {
        e.printStackTrace();
        return "error";
    }
    return "success";
}
  1. 文件上传的配置

application.properties中配置文件上传相关参数:

# 文件上传配置
# 存储位置
file.upload.dir=/path/to/save/
# 文件大小限制(单位MB)
file.max-size=10

然后在WebMvcConfigurer中添加文件上传相关的Bean,具体内容如下:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Value("${file.upload.dir}")
    private String uploadDir;
    @Value("${file.max-size}")
    private long maxFileSize;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/files/**").addResourceLocations("file:" + uploadDir);
    }

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setLocation(uploadDir);
        factory.setMaxFileSize(DataSize.ofMegabytes(maxFileSize));
        return factory.createMultipartConfig();
    }

    @Bean
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("utf-8");
        resolver.setMaxUploadSize(maxFileSize * 1024 * 1024);
        resolver.setMaxInMemorySize(4096);
        return resolver;
    }
}

文件下载

文件下载相对于文件上传而言要更加简单,主要有两种方式:一种是通过直接打开文件链接下载,另一种是通过响应头来实现。

直接打开文件链接下载

在前端,我们只需提供一个链接即可:

<a href="/download?fileName=myfile.txt">下载</a>

在后端的Controller中,我们只需将文件流写入响应中即可:

@GetMapping("/download")
public void downloadFile(@RequestParam("fileName") String fileName, HttpServletResponse response) {
    File file = new File("/path/to/" + fileName);
    try (InputStream is = new BufferedInputStream(new FileInputStream(file));
         OutputStream os = response.getOutputStream()
    ) {
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
        IOUtils.copy(is, os);
        os.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

响应头下载

在前端,我们需要通过Ajax获取文件内容,并获取文件名。

$.ajax({
    url: "/download",
    method: "post",
    responseType: "arraybuffer",
    data: {fileName: "myfile.txt"}
}).done(function (response) {
    var blob = new Blob([response], {type: "text/plain"});
    var fileName = "myfile.txt";
    var link = document.createElement("a");
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;
    link.click();
});

在后端,我们只需将文件流写入响应中即可:

@PostMapping("/download")
public void downloadFile(@RequestParam("fileName") String fileName, HttpServletResponse response) {
    File file = new File("/path/to/" + fileName);
    try (InputStream is = new BufferedInputStream(new FileInputStream(file))) {
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
        IOUtils.copy(is, response.getOutputStream());
        response.flushBuffer();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

以上就是文件上传和下载的两种实现方式。

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

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

相关文章

  • java获得指定日期的前一天,后一天的代码

    要获得指定日期的前一天或后一天,可以使用Java标准库中的java.util.Calendar类或者java.time.LocalDate类。下面分别介绍这两种方法的使用步骤和示例代码。 方法一:使用java.util.Calendar类 首先,需要创建一个Calendar对象,并设置需要操作的日期。 Calendar calendar = Calendar…

    Java 2023年5月20日
    00
  • Spring Security实现添加图片验证功能

    Spring Security是一个非常强大的安全框架,提供了很多实用的安全特性,可以使web应用程序更加安全可靠。其中,添加图片验证功能可以提高网站的安全性。下面是实现添加图片验证功能的完整攻略。 步骤一:添加依赖 在pom.xml文件中添加如下依赖: <dependency> <groupId>org.springframewor…

    Java 2023年5月20日
    00
  • jdbc链接远程数据库进行修改url操作

    jdbc是Java Database Connectivity的缩写,即Java数据库连接,是一种用于连接和操作关系型数据库的Java API。在访问数据库时,我们需要对jdbc进行配置,其中就包括jdbc的url地址。当我们需要连接远程数据库并修改其url地址时,需要进行以下步骤: 1. 加载数据库驱动 在使用jdbc连接数据库之前,需要将数据库驱动程序加…

    Java 2023年6月16日
    00
  • Mybatis之动态sql标签的使用

    那么首先我们先讲一下什么是Mybatis的动态sql标签。动态sql标签可以根据传递的参数生成不同的SQL查询语句,提供更加灵活的查询方式。相对于其他ORM框架,Mybatis的动态sql标签有独特的实现方式。那么接下来我们来看看如何使用Mybatis的动态sql标签。 判断语句标签<if> 我们可以使用<if>标签来进行条件判断。例…

    Java 2023年5月20日
    00
  • Java实现经典大富翁游戏的示例详解

    Java实现经典大富翁游戏的示例详解 简介 经典大富翁游戏是一种流行的模拟经营类游戏,玩家需要通过投骰子的方式前进,购买地产、升级、收取房租等,最终成为游戏中最富有的玩家。 在Java中,我们可以通过编写程序来实现大富翁游戏,并加入各种规则与特色玩法,成为一款自己的游戏。 下面,我们将详细讲解如何用Java来实现经典大富翁游戏。 实现步骤 确定游戏地图,包括…

    Java 2023年5月19日
    00
  • Java 常量字符串过长的解决方法

    Java 常量字符串过长的解决方法主要包括以下两种方式: 1. 使用换行符 Java中可以使用换行符\将一行代码分成多行,这也适用于字符串常量。可以在字符串过长的地方使用\将字符串分割成多行,从而解决字符串过长的问题。 示例代码: String str = "这是一个非常长的字符串,我们可以在适当的位置使用\"\\\"将它分成多…

    Java 2023年5月26日
    00
  • JDBC数据库连接过程及驱动加载与设计模式详解

    下面是对于“JDBC数据库连接过程及驱动加载与设计模式详解”的完整攻略: JDBC数据库连接过程 JDBC是JavaEE标准中定义的用于操作各种关系型数据库的API。使用JDBC连接到数据库的过程如下: 加载数据库驱动:使用Class.forName(driver)加载对应数据库的驱动类,其中driver是JDBC提供的数据库驱动类名。例如,连接MySQL数…

    Java 2023年5月20日
    00
  • Spring Data JPA 实现多表关联查询的示例代码

    下面是详细讲解 “Spring Data JPA 实现多表关联查询的示例代码” 的完整攻略。 1. 设置实体类之间的关联关系 在多表关联查询中,我们需要先设置实体类之间的关联关系,以让 JPA 知道它们之间的关联,从而能够生成正确的 SQL 语句。 在实体类中,我们可以使用 @ManyToOne、@OneToMany、@OneToOne、@ManyToMan…

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