package com.ruoyi.project.common; import com.ruoyi.basic.service.StorageBlobService; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.framework.aspectj.lang.annotation.Anonymous; import com.ruoyi.framework.web.domain.R; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.FileSystemResource; import org.springframework.http.ContentDisposition; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.List; /** * 通用请求处理 * * @author ruoyi */ @Tag(name = "通用接口") @AllArgsConstructor @RestController @RequestMapping("/common") public class CommonController { private static final Logger log = LoggerFactory.getLogger(CommonController.class); private final StorageBlobService storageBlobService; private final FileUtil fileUtil; // /** // * 通用下载请求 // * // * @param fileName 文件名称 // * @param delete 是否删除 // */ // @GetMapping("/download") // public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) // { // try // { // if (!FileUtils.checkAllowDownload(fileName)) // { // throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); // } // String realFileName = fileName.substring(fileName.indexOf("_") + 1); // // response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); // FileUtils.setAttachmentResponseHeader(response, realFileName); // FileUtils.writeBytes(fileName, response.getOutputStream()); /// / if (delete) /// / { /// / FileUtils.deleteFile(fileName); /// / } // } // catch (Exception e) // { // log.error("下载文件失败", e); // } // } // // /** // * 通用上传请求(单个) // */ // @PostMapping("/upload") // public AjaxResult uploadFile(MultipartFile file) throws Exception // { // try // { // // 上传文件路径 // String filePath = RuoYiConfig.getUploadPath(); // // 上传并返回新文件名称 // String fileName = FileUploadUtils.upload(filePath, file); // String url = serverConfig.getUrl() + fileName; // AjaxResult ajax = AjaxResult.success(); // ajax.put("url", url); // ajax.put("fileName", fileName); // ajax.put("newFileName", FileUtils.getName(fileName)); // ajax.put("originalFilename", file.getOriginalFilename()); // return ajax; // } // catch (Exception e) // { // return AjaxResult.error(e.getMessage()); // } // } // // /** // * 本地资源通用下载 // */ // @GetMapping("/download/resource") // public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) // throws Exception // { // try // { // if (!FileUtils.checkAllowDownload(resource)) // { // throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); // } // // 本地资源路径 // String localPath = RuoYiConfig.getProfile(); // // 数据库资源地址 // String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); // // 下载名称 // String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); // response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); // FileUtils.setAttachmentResponseHeader(response, downloadName); // FileUtils.writeBytes(downloadPath, response.getOutputStream()); // } // catch (Exception e) // { // log.error("下载文件失败", e); // } // } @PostMapping({"/upload"}) @Operation(summary = "文件上传") public R upload(@RequestParam("files") List files) throws Exception { return R.ok(storageBlobService.upload(files)); } @GetMapping("/download/{fileName}") @Anonymous public void download(@PathVariable String fileName, @RequestParam("token") String token, HttpServletResponse response) throws Exception { File file = storageBlobService.getFileByToken(fileName, token); String originalFileName = storageBlobService.getDownloadFileName(fileName); String encodedFileName = URLEncoder.encode(originalFileName, StandardCharsets.UTF_8.name()).replace("+", "%20"); response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + encodedFileName); response.setContentLengthLong(file.length()); Files.copy(file.toPath(), response.getOutputStream()); } @GetMapping("/preview/{fileName}") @Anonymous public ResponseEntity preview(@PathVariable String fileName, @RequestParam("token") String token) throws Exception { File file = fileUtil.compressFile(storageBlobService.getFileByToken(fileName, token)); String contentType = Files.probeContentType(file.toPath()); ContentDisposition contentDisposition = ContentDisposition.inline() .filename(fileName, StandardCharsets.UTF_8) .build(); return ResponseEntity.ok() .contentType(MediaType.parseMediaType(contentType != null ? contentType : "application/octet-stream")) .contentLength(file.length()) .header("Content-Disposition", contentDisposition.toString()) .body(new FileSystemResource(file)); } }