package com.yeqifu.sys.controller; import cn.hutool.core.date.DateUtil; import com.yeqifu.sys.common.AppFileUtils; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import org.springframework.http.HttpStatus; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * @Author: 落亦- * @Date: 2019/12/15 23:46 */ @RestController @RequestMapping("file") public class FileController { /** * 图片上传 * @param mf * @return */ @RequestMapping("uploadImage") public Map uploadImage(MultipartFile mf) { // 1. 得到文件名 String oldName = mf.getOriginalFilename(); // 2. 根据旧的文件名生成新的文件名 String newName = AppFileUtils.createNewFileName(oldName); // 3. 得到当前日期的字符串 String dirName = DateUtil.format(new Date(), "yyyy-MM-dd"); // 4. 构造文件夹 File dirFile = new File(AppFileUtils.UPLOAD_PATH, dirName); // 5. 判断当前文件夹是否存在 if (!dirFile.exists()) { // 如果不存在则创建新文件夹 dirFile.mkdirs(); } // 6. 构造文件对象 File file = new File(dirFile, newName + "_temp"); // 7. 把 mf 里面的图片信息写入 file try { mf.transferTo(file); } catch (IllegalStateException | IOException e) { e.printStackTrace(); } Map map = new HashMap<>(); map.put("path", dirName + "/" + newName + "_temp"); return map; } /** * 图片下载 * @param path 图片路径 * return */ @RequestMapping("showImageByPath") public ResponseEntity downloadImage(String path) { // 规范路径,防止路径穿越 Path normalizedPath = Paths.get(AppFileUtils.UPLOAD_PATH, path).normalize(); // 防止路径越界,确保文件在允许的上传目录下 if (!normalizedPath.startsWith(AppFileUtils.UPLOAD_PATH)) { return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); // 如果路径越界,返回403 Forbidden } // 检查文件是否存在 File file = normalizedPath.toFile(); if (!file.exists() || !file.isFile()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); // 文件不存在,返回404 Not Found } try { // 读取文件内容 byte[] fileContent = Files.readAllBytes(normalizedPath); // 根据文件扩展名推测文件类型并返回适当的 Content-Type String contentType = Files.probeContentType(normalizedPath); if (contentType == null) { contentType = "application/octet-stream"; // 默认二进制流类型 } // 返回文件内容,设置响应头和状态码 return ResponseEntity.ok() .contentType(MediaType.valueOf(contentType)) .body(fileContent); } catch (IOException e) { // 异常捕获并返回500服务器错误 e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); // 服务器错误 } } }