首页 > 其他分享 >Spring Boot实现文件上传和下载

Spring Boot实现文件上传和下载

时间:2023-12-13 10:01:37浏览次数:21  
标签:文件 Spring Boot headers file import new 上传

实现Spring Boot文件上传和下载的步骤:
1.文件上传
在pom.xml文件中添加依赖:spring-boot-starter-web和spring-boot-starter-thymeleaf。
创建一个上传前端的页面,包括一个表单来选择文件和一个提交按钮。
在Controller中添加一个POST方法,该方法接受MultipartFile参数,将文件保存在服务器上。
在application.properties文件中配置上传文件的最大大小和文件存储路径。
2.文件下载
在Controller中添加一个GET方法,该方法接收一个文件名参数,通过ResponseEntity将文件内容返回给客户端。
如果需要授权访问,则可以通过使用Spring Security实现基本身份验证。
以下是Spring Boot实现文件上传和下载的代码示例:

1.文件上传
pom.xml依赖配置:

<!-- 文件上传 -->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.3</version>
</dependency><!-- Servlet API -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
  <scope>provided</scope>
</dependency>



在配置文件中配置:
# 开启上传和下载
spring.servlet.multipart.enabled=true
# 最大的文件大小
spring.servlet.multipart.max-file-size=30MB
# 单次最大请求大小
spring.servlet.multipart.max-request-size=30MB
# 自定义的上传文件存放路径
file.upload.dir=e:/test

在Controller中添加一个POST方法:

@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    if (file.isEmpty()) {
        return "上传失败,请选择文件";
    }    // 获取文件名
    String fileName = file.getOriginalFilename();
    // 获取文件的后缀名
    String suffixName = fileName.substring(fileName.lastIndexOf("."));    // 上传后的路径
    String filePath = "D:/upload/";    // 解决中文问题,liunx下中文路径,图片显示问题
    fileName = UUID.randomUUID() + suffixName;    // 构建上传路径
    File dest = new File(filePath + fileName);    // 检测是否存在目录
    if (!dest.getParentFile().exists()) {
        dest.getParentFile().mkdirs();
    }    try {
        // 保存文件
        file.transferTo(dest);
        return "上传成功";
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "上传失败";
}

2.文件下载
在Controller中添加一个GET方法:

@GetMapping("/download")
public ResponseEntity<byte[]> download() throws IOException {
    // 获取文件
    File file = new File("D:/upload/1.jpg");    // 构造响应
    HttpHeaders headers = new HttpHeaders();
    headers.setContentDispositionFormData("attachment", file.getName());
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    return new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}

编写Controller方法
@GetMapping("/download")
public void downloadFile(HttpServletResponse response) {
    try {
        //获取要下载的文件
        File file = new File("file_path");        //设置响应的内容类型为二进制流,即文件类型
        response.setContentType("application/octet-stream");        //设置文件名
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));        //创建输入流
        FileInputStream inputStream = new FileInputStream(file);
        BufferedInputStream buffInputStream = new BufferedInputStream(inputStream);        //创建输出流
        ServletOutputStream outputStream = response.getOutputStream();
        BufferedOutputStream buffOutputStream = new BufferedOutputStream(outputStream);        //循环读取数据并写入到响应输出流中
        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = buffInputStream.read(buffer)) != -1) {
            buffOutputStream.write(buffer, 0, len);
        }        //关闭流
        buffOutputStream.flush();
        buffOutputStream.close();
        outputStream.flush();
        outputStream.close();
        buffInputStream.close();
        inputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

在SpringBoot中,我们可以通过以下步骤实现文件响应给浏览器实现下载:

在Controller中编写请求处理方法,并使用@GetMapping注解来指定该方法处理GET请求。

在方法中使用InputStreamResource将本地文件以流的形式读取到内存中。

使用ResponseEntity.ok()方法构造响应,并将之前获取到的InputStreamResource作为参数传入。

使用.header()方法设置响应头,包括Content-Disposition、Content-Type等信息。

以下是一个示例代码:

import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;@Controller
public class FileDownloadController {

    @GetMapping("/download")
    public ResponseEntity<InputStreamResource> downloadFile() throws IOException {
        String filename = "example.txt";
        InputStream is = new FileInputStream(filename);
        InputStreamResource resource = new InputStreamResource(is);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment; filename=\"" + filename + "\"");
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");

        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(is.available())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(resource);
    }
}


其中,Content-Disposition头用于描述响应结果的类型,这里指定为attachment表示要下载的文件,filename表示文件名。

Cache-Control、Pragma、Expires头用于控制缓存的行为,这里设为不缓存。

最后将InputStreamResource对象作为响应体返回即可。

 

参考文章:http://blog.ncmem.com/wordpress/2023/12/04/spring-boot实现文件上传和下载/


标签:文件,Spring,Boot,headers,file,import,new,上传
From: https://blog.51cto.com/u_14023400/8798271

相关文章

  • spring使用druid多数据源yml密码加密
    1.依赖<!--Mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.24</version></dependency><!--Druid--><dependency>......
  • 【SpringBootWeb入门-11】MySQL-概述-安装配置
    1、入门前言之前的文章我们讲解了javaweb的springboot框架的入门学习,javaweb开发-数据库也是我们需要学习的核心之一,接下来我们进入MySQL的学习,本篇内容主要讲解MySQL的安装以及配置。2、MySQL下载MySQL官方给我们提供了两种不同的版本:商业版本和社区版本,具体区别如下图:我们......
  • 使用git工具将本地文件上传到github仓库
    使用git工具将本地文件上传到github仓库一、基本步骤第一步:我们需要先创建一个本地的版本库(其实也就是一个文件夹)。第二步:在命令行中输入gitinit把这个文件夹变成Git可管理的仓库然后通过gitadd.("."表示当前文件夹下所有内容都提交,也可以通过gitaddFileName/FolderName......
  • SpringBoot MongoTemplate 实现分页
    一、MongoTemplate实现分页springboot集成Mongodb好像没有现成的分页工具,只能自己先查总数再查数据,需要进行两次查询。例如:@Testpublicvoidtest_119()throwsException{Queryquery=newQuery();longtotal=mongoTemplate.count(query,Dog.class);query.w......
  • java文件的上传与下载
    1、文件上传下载1.1文件上传什么是文件上传?要将客户端(浏览器)大数据存储到服务器端,不将数据直接存储到数据库中,而是要将数据存储到服务器所在的磁盘上,这就要使用文件上传。为什么使用文件上传?通过文件上传,可以将浏览器端的大数据直接保存到服务器端。不将数据保存到数据库中......
  • Java Spring Boot 拦截器的使用小结
    很多时候,我们在开发项目中,总是希望在接口中,尽量进行业务处理,其余的事项交给其他组件来处理,比如:登录验证日志记录接口性能在SpringBoot中,正如大多数框架一样,可以用到拦截件进行处理,不管叫中间件还是拦截件,总之都是为了让我们更好的专注于业务,解耦功能。我们看看SpringB......
  • select for update在springboot里实现分布式锁
    //mapper,注意,这里的参数最好就是主键或者唯一键,否则产生的是表锁@Select("<script>select*fromfoowhereid=#{id}forupdate</script>")FooselectForUpdateById(@Param("id")Longid);//service,必须加事物,否则selectForUpdateById无法实现分布式锁的作用@Transac......
  • uboot移植及图形化配置
    一、编译通过官方的uboot,修改uboot,参考文档一些配置文件,lcd、网络配置二、图形化配置界面1.指定默认配置文件makemx6ull_alientek_emmc_defconfig2.打开图形化配置界面makemenuconfig3.完成配置后编辑完成之后要保存好当前的配置文件如./configs/test_defconfigsave ......
  • java实现文件上传和下载
    本文实例为大家分享了java实现文件上传和下载的具体代码,供大家参考,具体内容如下文件的上传upload:文件上传客户端通过表单的文件域file 把客户端的文件上传保存到服务器的硬盘上页面首先对上传的表单有以下要求:必须有文件域:inputtype=file表单提交方式:method=post表......
  • springboot listener、filter登录实战
    转载自:www.javaman.cn博客系统访问:http://175.24.198.63:9090/front/index登录功能1、前端页面采用的是layui-admin框架,文中的验证码内容,请参考作者之前的验证码功能<!DOCTYPEhtml><htmllang="zh"xmlns:th="http://www.thymeleaf.org"><head><title>ds博客</tit......