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 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); } }