12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- package com.backendsys.modules.download.controller;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.core.io.InputStreamResource;
- import org.springframework.core.io.Resource;
- import org.springframework.http.*;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RestController;
- import java.io.*;
- import java.nio.charset.StandardCharsets;
- import java.util.Arrays;
- /**
- * 下载本地文件
- */
- @RestController
- public class DownloadLocalController {
- @Value("${file.upload.directory}") // 配置保存文件的目录
- private String uploadDirectory;
- // 判断文件是否为图片文件
- private boolean isImageFile(File file) {
- String extension = getExtension(file.getName());
- return Arrays.asList("jpg", "jpeg", "png", "gif").contains(extension.toLowerCase());
- }
- // 获取图片文件对应的MediaType
- private MediaType getImageMediaType(File file) {
- String extension = getExtension(file.getName());
- switch (extension.toLowerCase()) {
- case "jpg":
- case "jpeg": return MediaType.IMAGE_JPEG;
- case "png": return MediaType.IMAGE_PNG;
- case "gif": return MediaType.IMAGE_GIF;
- default: return MediaType.APPLICATION_OCTET_STREAM;
- }
- }
- public static String getExtension(String filename) {
- if (filename == null) { return ""; }
- int dotIndex = filename.lastIndexOf(".");
- if (dotIndex > 0 && dotIndex < filename.length() - 1) {
- return filename.substring(dotIndex + 1);
- }
- return "";
- }
- @GetMapping("/uploads/{folder}/{filename:.+}")
- public ResponseEntity<Resource> serveFile(@PathVariable String folder, @PathVariable String filename) throws IOException {
- File file = new File(uploadDirectory + folder + "/" + filename);
- // 如果是图片,则直接显示;如果是文件,则是下载
- HttpHeaders headers = new HttpHeaders();
- if (isImageFile(file)) {
- // 如果是图片文件,设置Content-Type为对应的图片MIME类型
- headers.setContentType(getImageMediaType(file));
- } else {
- // 如果不是图片文件,设置Content-Disposition以附件形式下载
- headers.setContentDisposition(ContentDisposition.attachment().filename(file.getName()).build());
- headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
- }
- if (!file.exists()) {
- String message = "图片不存在";
- InputStream inputStream = new ByteArrayInputStream(message.getBytes(StandardCharsets.UTF_8));
- InputStreamResource resource = new InputStreamResource(inputStream);
- return ResponseEntity.status(HttpStatus.NOT_FOUND)
- .contentType(MediaType.valueOf("text/plain; charset=UTF-8"))
- .body(resource);
- }
- InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
- return ResponseEntity.ok()
- .headers(headers)
- .contentLength(file.length())
- //.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
- //.contentType(MediaType.APPLICATION_OCTET_STREAM)
- .body(resource);
- }
- }
|