package com.ruoyi.web.controller.common; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.QRCodeUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.file.ImageUtils; import com.ruoyi.framework.config.ServerConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; /** * 通用请求处理 * * @author ruoyi */ @RestController @RequestMapping("/common") public class CommonController { private static final Logger log = LoggerFactory.getLogger(CommonController.class); @Autowired private ServerConfig serverConfig; private static final String FILE_DELIMETER = ","; /** * 通用下载请求 * * @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 = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); String filePath = RuoYiConfig.getDownloadPath() + fileName; response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); FileUtils.setAttachmentResponseHeader(response, realFileName); FileUtils.writeBytes(filePath, response.getOutputStream()); if (delete) { FileUtils.deleteFile(filePath); } } catch (Exception e) { log.error("下载文件失败", e); } } /** * 通用上传请求(单个) */ @PostMapping("/upload") public AjaxResult uploadFile(MultipartFile file) throws Exception { try { // 上传文件路径 String filePath = RuoYiConfig.getUploadPath(); String thumbnailPath = ""; // 上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); String url = serverConfig.getUrl() + fileName; String fileType = FileUtils.getFileType(file); if ("video".equalsIgnoreCase(fileType)) { thumbnailPath = fileName.replace("/profile", RuoYiConfig.getProfile()); int dotIndex = thumbnailPath.lastIndexOf("."); if (dotIndex != -1) { thumbnailPath = thumbnailPath.substring(0, dotIndex) + ".jpg"; } else { thumbnailPath = thumbnailPath + ".jpg"; // 如果没有后缀,直接加 .jpg } FileUtils.screenShots(fileName.replace("/profile", RuoYiConfig.getProfile()), thumbnailPath, "00:00:01"); } if ("image".equalsIgnoreCase(fileType)) { //获取用户名 String username = SecurityUtils.getUsername(); // 原始文件 if (fileName.contains("/profile/upload")) { fileName = fileName.replace("/profile/upload", ""); } File sourceFile = new File(filePath + fileName); //图片添加水印 String watermarkFileName = "watermark_" + fileName; File destFile = new File(filePath + fileName); // 加水印 ImageUtils.addWatermark(sourceFile, destFile, "@" + username, "次元时代-ACG爱好者社区"); fileName = watermarkFileName; } AjaxResult ajax = AjaxResult.success(); ajax.put("url", url); ajax.put("fileName", fileName); ajax.put("newFileName", FileUtils.getName(fileName)); ajax.put("originalFilename", file.getOriginalFilename()); ajax.put("fileType", fileType); ajax.put("thumbnailPath", thumbnailPath); return ajax; } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } // /** // * 通用上传请求(单个) // */ // @PostMapping("/upload") // public AjaxResult uploadFile(MultipartFile file) throws Exception { // try { // // 上传文件路径 // String filePath = RuoYiConfig.getUploadPath(); // String thumbnailPath = ""; // // 上传并返回新文件名称 // String fileName = OssUtils.uploadMultipartFile(file); // System.out.println(fileName); // String url = OssUtils.getOssFilePath(fileName); // String fileType = FileUtils.getFileType(file); // if ("video".equalsIgnoreCase(fileType)) { // thumbnailPath = fileName; // int dotIndex = thumbnailPath.lastIndexOf("."); // if (dotIndex != -1) { // thumbnailPath = thumbnailPath.substring(0, dotIndex) + ".jpg"; // } else { // thumbnailPath = thumbnailPath + ".jpg"; // 如果没有后缀,直接加 .jpg // } // FileUtils.screenShots(fileName.replace("/profile", RuoYiConfig.getProfile()), thumbnailPath, "00:00:01"); // } // AjaxResult ajax = AjaxResult.success(); // ajax.put("url", url); // ajax.put("fileName", fileName); // ajax.put("newFileName", FileUtils.getName(fileName)); // ajax.put("originalFilename", file.getOriginalFilename()); // ajax.put("fileType", fileType); // ajax.put("thumbnailPath", thumbnailPath); // return ajax; // } catch (Exception e) { // return AjaxResult.error(e.getMessage()); // } // } /** * 通用上传请求(多个) */ @PostMapping("/uploads") public AjaxResult uploadFiles(List files) throws Exception { try { // 上传文件路径 String filePath = RuoYiConfig.getUploadPath(); List urls = new ArrayList(); List fileNames = new ArrayList(); List newFileNames = new ArrayList(); List originalFilenames = new ArrayList(); for (MultipartFile file : files) { // 上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); String url = serverConfig.getUrl() + fileName; urls.add(url); fileNames.add(fileName); newFileNames.add(FileUtils.getName(fileName)); originalFilenames.add(file.getOriginalFilename()); } AjaxResult ajax = AjaxResult.success(); ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); 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); } } /** * 生成二维码 * * @param * @return */ @GetMapping("/loginUserQRCode") public AjaxResult generateAndUploadQRCode() { String fileName = ""; try { Long userId = SecurityUtils.getLoginUser().getUser().getUserId(); JSONObject userIdObj = new JSONObject(); userIdObj.put("userId", userId); // 1. 生成临时二维码图片 fileName = "qrcode_" + userId + ".png"; Path tempFile = Paths.get(System.getProperty("java.io.tmpdir"), fileName); QRCodeUtils.generateQRCode(userIdObj.toJSONString(), tempFile, 300, 300); // 2. 转为 MultipartFile 格式,便于调用 RuoYi 的上传接口 File file = tempFile.toFile(); MultipartFile multipartFile = FileUtils.convertFileToMultipartFile(file); // 3. 使用 RuoYi 的文件上传工具进行上传 String uploadPath = FileUploadUtils.upload(RuoYiConfig.getUploadPath(), multipartFile); // 4. 拼接访问 URL 并返回给前端 String fileUrl = serverConfig.getUrl() + uploadPath; return AjaxResult.success("二维码生成成功", fileUrl); } catch (Exception e) { e.printStackTrace(); return AjaxResult.error("二维码生成或上传失败"); } finally { //清理临时文件 FileUtils.cleanTempDir(fileName); } } }