springboot实现文件上传与下载

雨点打透心脏的1/2处 2023-10-08 23:32 41阅读 0赞

一: 文件上传

1.可以通过form表单测试,MultipartFile对象是通过form表单的file类型请求的,是通过表单的name值获取的value值

2.也可以通过swagger测试,访问路径:http://127.0.0.1:8081/swagger-ui.html#/

3.postman调接口测试

例如:通过 form表单测试:

1) 前端页面代码:

  1. <form th:action="@{/upload}" method="post" enctype="multipart/form-data">
  2. 头像:<input type="file" name="headerImg"><br>
  3. <input type="submit" value="上传">
  4. </form>

2)controller层代码

  1. @RestController
  2. public class UploadController {
  3. // 文件上传 RequestMapping默认get请求
  4. @PostMapping("/upload")
  5. //MultipartFile对象是通过form表单的file类型请求的,是通过表单的name值获取的value值,也可以通过swagger测试
  6. public void upload(MultipartFile headerImg) throws IOException {
  7. // 单文件上传
  8. if (!headerImg.isEmpty()) {
  9. // 获取上传文件的原始名称,获取上传的文件的文件名 x.xxx(1.jpg)
  10. String originalFilename = headerImg.getOriginalFilename();
  11. // 设置上传文件的保存地址目录(存放在项目路径下)
  12. String dirPath = "E:\\Movie";
  13. // 字符串截取后缀名
  14. // String suffix = uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf('.'));
  15. // 设置上传后的文件名称(拼接) //获取uuid ,随机生成一个名字
  16. String newFileName = UUID.randomUUID() + "_" + originalFilename;
  17. //File.separator:自动匹配路径的分隔符(在不确定路径的分隔符是\还是/的时候可以使用)
  18. //上传文件
  19. headerImg.transferTo(new File(dirPath + File.separator + newFileName));
  20. }
  21. }
  22. }

3)要上传大文件必须要配置yml文件

  1. spring:
  2. #配置上传文件大小设置
  3. servlet:
  4. multipart:
  5. enabled: true
  6. max-file-size: 10MB #单个文件的最大上限
  7. max-request-size: 30MB #单个请求的文件总大小上限

二: 文件下载

1.导入依赖

  1. <!--文件下载-->
  2. <dependency>
  3. <groupId>commons-io</groupId>
  4. <artifactId>commons-io</artifactId>
  5. <version>2.6</version>
  6. </dependency>

2.yml文件中配置

  1. spring:
  2. # 设置文件大小
  3. servlet:
  4. multipart:
  5. max-file-size: 10MB
  6. max-request-size: 100MB

3.controller层测试代码

(1) 根据浏览器的不同进行编码设,返回编码后的文件名

在类中写这个方法即可:

  1. public String getFileName(HttpServletRequest request, String filename) throws Exception {
  2. //IE不同版本User-Agent中出现的各种关键词
  3. String[] IEBrowserKeyWords = {"MSIE", "Trident", "Edge"};
  4. //获取请求头代理信息
  5. String userAgent = request.getHeader("User-Agent");
  6. for (String keyWord : IEBrowserKeyWords) {
  7. if (userAgent.contains(keyWord)) {
  8. //IE内核浏览器,统一为UTF-8编码显示
  9. return URLEncoder.encode(filename, "UTF-8");
  10. }
  11. }
  12. //其它浏览器统一为ISO-8859-1编码显示
  13. return new String(filename.getBytes("UTF-8"), "ISO-8859-1");
  14. }

(2)下面 download()方法中的第二个参数filename是你想要下载的 文件名.后缀(例如:XXX.jpg),在发起请求的时候把文件名传进去,和文件路径拼接;

也可以直接在代码中写死,删掉方法中第二个形参,在方法中声明 String filename = “文件名.后缀”。

  1. // 文件下载
  2. @PostMapping("/download")
  3. public ResponseEntity<byte[]> download(HttpServletRequest request, String filename) throws Exception {
  4. // 确定要下载的文件路径
  5. String dirPath = "文件路径";
  6. // 创建该文件对象(谷歌所用)
  7. File file = new File(dirPath + "/" + filename);
  8. System.out.println(file);
  9. //对文件名编码,防止中文乱码
  10. filename = this.getFileName(request,filename);
  11. // 设置响应头
  12. HttpHeaders headers = new HttpHeaders();
  13. // 通知浏览器以下载的方式打开文件
  14. headers.setContentDispositionFormData("attachment", filename);
  15. // 定义以流的方式下载返回文件的数据
  16. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  17. // 将该对象读取时按字节传送
  18. byte[] array = FileUtils.readFileToByteArray(file);
  19. // 使用SpringMVC框架的ResponseEntity对象封装返回下载数据
  20. ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(array, headers, HttpStatus.OK);
  21. return responseEntity;
  22. }

在此,祝各位帅哥美女,步步高升,一帆风顺!!!

发表评论

表情:
评论列表 (有 0 条评论,41人围观)

还没有评论,来说两句吧...

相关阅读