一、上传文件

而在 Java 中,一个接口只支持一种 content-type,

  • json 就用 @RequestBody
  • form 表单就用 @RequestParam 或不写
  • form-data 就用 MultipartFile。 ```java package com.tj.reggie.controller.file;

import com.tj.reggie.controller.utils.R; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.UUID;

/**

  • 文件上传和下载 / @RestController @RequestMapping(“/common”) @Slf4j public class FileController { /*

    • 上传 *
    • @param file 这个名称必须和前端的formData 文件的名称要对应
    • @return */ @PostMapping(“/upload”) public R upload(MultipartFile file) throws IOException { //file是一个临时文件,需要转存到指定位置,否则本次请求完成后就会被删除

      //获取原始文件名 String originalFilename = file.getOriginalFilename(); //获取原始文件名的后缀 String suffix = originalFilename.substring(originalFilename.lastIndexOf(“.”));

      //使用UUID重新生成文件名,防止文件名称重复造成文件覆盖 String s = UUID.randomUUID().toString() + suffix;

      //将文件转存到指定位置“D:/222” String baseDir = “D:/222/“; //创建一个目录对象 File dir = new File(baseDir); //如果目录不存在,则创建目录 if (!dir.exists()) dir.mkdirs();

      String fileName = “ceshi.jpg”; file.transferTo(new File(baseDir + fileName)); return R.success(baseDir + fileName); }

      /**

    • 文件下载 *
    • @param name */ @GetMapping(“/download”) public void download(String name, HttpServletResponse response) {

      //要下载的文件路径 String url = “d:/TJ111/222.jpg”; response.setContentType(“image/jpeg”); //设置响应格式 try (// 把原始的字节输入流包装成高级的缓冲字节输入流

      1. // 输入流,通过输入流读取文件内容
      2. InputStream bis = new BufferedInputStream(new FileInputStream(new File(url)));
      3. // 把原始的字节输出流包装成高级的缓冲字节输出流
      4. //输出流,通过输出流将文件写回浏览器,在浏览器展示图片了
      5. OutputStream bos = new BufferedOutputStream(response.getOutputStream());

      ) { // 定义一个字节数组转移数据

      1. byte[] buffer = new byte[1024];
      2. int len;//记录每次读取的字节数
      3. while ((len = bis.read(buffer)) != -1) {
      4. bos.write(buffer, 0, len); //读多少,输出多少
      5. }
      6. log.info("文件下载完成");

      } catch (FileNotFoundException e) {

      1. e.printStackTrace();

      } catch (IOException e) {

      1. e.printStackTrace();

      }

  1. }

}

  1. <a name="ezaSv"></a>
  2. ## 二、下载文件
  3. 参考:[Java下载文件的四种方式详细代码](https://www.jb51.net/article/232182.htm)<br />[Java获取文件类型的5种方法](https://baijiahao.baidu.com/s?id=1697974203366117168)
  4. ```java
  5. /**
  6. * 文件下载
  7. *
  8. * @param response 响应输出
  9. * @param file File文件
  10. * @throws IOException
  11. */
  12. public static void downloadFile(HttpServletResponse response, File file) throws IOException {
  13. //设置响应格式,文件类型ContentType
  14. response.setContentType(Files.probeContentType(file.toPath()));
  15. //设置文件名
  16. response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
  17. try (// 把原始的字节输入流包装成高级的缓冲字节输入流
  18. // 输入流,通过输入流读取文件内容
  19. InputStream bis = new BufferedInputStream(new FileInputStream(file));
  20. // 把原始的字节输出流包装成高级的缓冲字节输出流
  21. //输出流,通过输出流将文件写回浏览器,在浏览器展示图片了
  22. OutputStream bos = new BufferedOutputStream(response.getOutputStream());
  23. ) { // 定义一个字节数组转移数据
  24. byte[] buffer = new byte[1024];
  25. int len;//记录每次读取的字节数
  26. while ((len = bis.read(buffer)) != -1) {
  27. bos.write(buffer, 0, len); //读多少,输出多少
  28. }
  29. log.info("文件下载完成");
  30. } catch (FileNotFoundException e) {
  31. e.printStackTrace();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }