DownloadLocalController.java 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package com.backendsys.modules.download.controller;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.core.io.InputStreamResource;
  4. import org.springframework.core.io.Resource;
  5. import org.springframework.http.*;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import java.io.*;
  10. import java.nio.charset.StandardCharsets;
  11. import java.util.Arrays;
  12. /**
  13. * 下载本地文件
  14. */
  15. @RestController
  16. public class DownloadLocalController {
  17. @Value("${file.upload.directory}") // 配置保存文件的目录
  18. private String uploadDirectory;
  19. // 判断文件是否为图片文件
  20. private boolean isImageFile(File file) {
  21. String extension = getExtension(file.getName());
  22. return Arrays.asList("jpg", "jpeg", "png", "gif").contains(extension.toLowerCase());
  23. }
  24. // 获取图片文件对应的MediaType
  25. private MediaType getImageMediaType(File file) {
  26. String extension = getExtension(file.getName());
  27. switch (extension.toLowerCase()) {
  28. case "jpg":
  29. case "jpeg": return MediaType.IMAGE_JPEG;
  30. case "png": return MediaType.IMAGE_PNG;
  31. case "gif": return MediaType.IMAGE_GIF;
  32. default: return MediaType.APPLICATION_OCTET_STREAM;
  33. }
  34. }
  35. public static String getExtension(String filename) {
  36. if (filename == null) { return ""; }
  37. int dotIndex = filename.lastIndexOf(".");
  38. if (dotIndex > 0 && dotIndex < filename.length() - 1) {
  39. return filename.substring(dotIndex + 1);
  40. }
  41. return "";
  42. }
  43. @GetMapping("/uploads/{folder}/{filename:.+}")
  44. public ResponseEntity<Resource> serveFile(@PathVariable String folder, @PathVariable String filename) throws IOException {
  45. File file = new File(uploadDirectory + folder + "/" + filename);
  46. // 如果是图片,则直接显示;如果是文件,则是下载
  47. HttpHeaders headers = new HttpHeaders();
  48. if (isImageFile(file)) {
  49. // 如果是图片文件,设置Content-Type为对应的图片MIME类型
  50. headers.setContentType(getImageMediaType(file));
  51. } else {
  52. // 如果不是图片文件,设置Content-Disposition以附件形式下载
  53. headers.setContentDisposition(ContentDisposition.attachment().filename(file.getName()).build());
  54. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  55. }
  56. if (!file.exists()) {
  57. String message = "图片不存在";
  58. InputStream inputStream = new ByteArrayInputStream(message.getBytes(StandardCharsets.UTF_8));
  59. InputStreamResource resource = new InputStreamResource(inputStream);
  60. return ResponseEntity.status(HttpStatus.NOT_FOUND)
  61. .contentType(MediaType.valueOf("text/plain; charset=UTF-8"))
  62. .body(resource);
  63. }
  64. InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
  65. return ResponseEntity.ok()
  66. .headers(headers)
  67. .contentLength(file.length())
  68. //.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
  69. //.contentType(MediaType.APPLICATION_OCTET_STREAM)
  70. .body(resource);
  71. }
  72. }