From 71fba5328a35b449b11088e540932787220f91d8 Mon Sep 17 00:00:00 2001 From: liding <756868258@qq.com> Date: 星期三, 18 六月 2025 17:28:50 +0800 Subject: [PATCH] 1.生产加工变更库存回滚 2.巡检,档案上传完善 --- ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java | 146 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 140 insertions(+), 6 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java index 4b87a2e..ff2dab3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java @@ -9,6 +9,8 @@ import io.minio.http.Method; import io.minio.messages.DeleteError; import io.minio.messages.DeleteObject; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; import lombok.Getter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -16,15 +18,11 @@ import org.springframework.util.FastByteArrayOutputStream; import org.springframework.web.multipart.MultipartFile; -import jakarta.servlet.ServletOutputStream; -import jakarta.servlet.http.HttpServletResponse; import java.io.InputStream; +import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -303,4 +301,140 @@ return null; } + /** + * 涓嬭浇url锛堝己鍒舵祻瑙堝櫒涓嬭浇鏂囦欢锛� + * @param bucketFileName minio鏂囦欢鍚嶇О + * @param bucketName 瀛樺偍妗跺悕绉� + * @param 锛堝皬鏃讹級锛岄粯璁�24灏忔椂 + * @return 鏂囦欢涓嬭浇URL + */ + public String getDownloadUrl(String bucketFileName, String bucketName) { + if (StringUtils.isNotBlank(bucketFileName)) { + try { + // 妫�鏌ユ枃浠舵槸鍚﹀瓨鍦� + minioClient.statObject(StatObjectArgs.builder() + .bucket(bucketName) + .object(bucketFileName) + .build()); + + // 璁剧疆鍝嶅簲澶� + Map<String, String> reqParams = new HashMap<>(); + // 鎻愬彇鍘熷鏂囦欢鍚嶏紙濡傛灉瀛樺偍鏃朵繚鐣欎簡鍘熷鍚嶇О锛� + String originalFileName = extractOriginalFileName(bucketFileName); + reqParams.put("response-content-disposition", + "attachment; filename=\"" + URLEncoder.encode(originalFileName, StandardCharsets.UTF_8) + "\""); + + // 鏋勫缓棰勭鍚峌RL鍙傛暟 + GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder() + .method(Method.GET) + .bucket(bucketName) + .object(bucketFileName) + .expiry(previewExpiry, TimeUnit.HOURS) + .extraQueryParams(reqParams) + .build(); + + return minioClient.getPresignedObjectUrl(args); + } catch (Exception e) { + throw new UtilException("MinioUtils锛氱敓鎴愪笅杞介摼鎺ュ紓甯�", e); + } + } + return null; + } + + /** + * 浠巄ucketFileName涓彁鍙栧師濮嬫枃浠跺悕 + * 闇�鏍规嵁瀹為檯瀛樺偍瑙勫垯璋冩暣锛堜緥濡傦紝濡傛灉瀛樺偍鏃舵坊鍔犱簡鏃堕棿鎴虫垨UUID鍚庣紑锛� + */ + private String extractOriginalFileName(String bucketFileName) { + // 绀轰緥锛氬鏋滃瓨鍌ㄦ牸寮忎负 "鍘熷鏂囦欢鍚峗UUID" + int underscoreIndex = bucketFileName.lastIndexOf("_"); + if (underscoreIndex > 0) { + return bucketFileName.substring(0, underscoreIndex); + } + // 濡傛灉娌℃湁鐗规畩鏍煎紡锛岀洿鎺ヨ繑鍥炲畬鏁存枃浠跺悕 + return bucketFileName; + } + + + /** + * 鐢熸垚棰勮URL + * @param bucketFilename 鏂囦欢鍦∕inIO涓殑鍞竴鏍囪瘑 + * @param bucketName 瀛樺偍妗跺悕绉� + * @param useDefaultExpiry 鏄惁浣跨敤榛樿杩囨湡鏃堕棿锛坱rue=浣跨敤榛樿杩囨湡鏃堕棿锛宖alse=姘镐箙鏈夋晥锛� + * @return 棰勮URL + */ + public String getPreviewUrls(String bucketFilename, String bucketName, boolean useDefaultExpiry) { + if (StringUtils.isBlank(bucketFilename)) { + return null; + } + + try { + // 楠岃瘉鏂囦欢瀛樺湪鎬� + minioClient.statObject(StatObjectArgs.builder() + .bucket(bucketName) + .object(bucketFilename) + .build()); + + GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder() + .method(Method.GET) + .bucket(bucketName) + .object(bucketFilename); + + // 璁剧疆杩囨湡鏃堕棿锛歶seDefaultExpiry=true 浣跨敤閰嶇疆鐨勮繃鏈熸椂闂� + if (useDefaultExpiry) { + builder.expiry(previewExpiry, TimeUnit.HOURS); + } + + return minioClient.getPresignedObjectUrl(builder.build()); + } catch (Exception e) { + throw new UtilException("鐢熸垚棰勮URL澶辫触: " + e.getMessage(), e); + } + } + + /** + * 鐢熸垚涓嬭浇URL锛堝己鍒舵祻瑙堝櫒涓嬭浇锛� + * @param bucketFilename 鏂囦欢鍦∕inIO涓殑鍞竴鏍囪瘑 + * @param bucketName 瀛樺偍妗跺悕绉� + * @param originalFileName 鍘熷鏂囦欢鍚嶏紙鐢ㄤ簬涓嬭浇鏃舵樉绀猴級 + * @param useDefaultExpiry 鏄惁浣跨敤榛樿杩囨湡鏃堕棿锛坱rue=浣跨敤榛樿锛宖alse=鏃犺繃鏈熸椂闂达級 + * @return 涓嬭浇URL + */ + public String getDownloadUrls(String bucketFilename, String bucketName, String originalFileName, boolean useDefaultExpiry) { + if (StringUtils.isBlank(bucketFilename)) { + return null; + } + + try { + // 楠岃瘉鏂囦欢瀛樺湪鎬� + minioClient.statObject(StatObjectArgs.builder() + .bucket(bucketName) + .object(bucketFilename) + .build()); + + // 姝g‘缂栫爜鏂囦欢鍚嶏細鏇挎崲 + 涓� %20 + String encodedFileName = URLEncoder.encode(originalFileName, StandardCharsets.UTF_8) + .replace("+", "%20"); + + Map<String, String> reqParams = new HashMap<>(); + reqParams.put("response-content-disposition", + "attachment; filename=\"" + encodedFileName + "\""); + + GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder() + .method(Method.GET) + .bucket(bucketName) + .object(bucketFilename) + .extraQueryParams(reqParams); + + // 鏍规嵁鍙傛暟鍐冲畾鏄惁璁剧疆杩囨湡鏃堕棿 + if (useDefaultExpiry) { + // 浣跨敤榛樿杩囨湡鏃堕棿锛堜粠閰嶇疆璇诲彇锛� + builder.expiry(previewExpiry, TimeUnit.HOURS); + } else { + // 涓嶈缃繃鏈熸椂闂达紙MinIO 榛樿7澶╋級 + } + return minioClient.getPresignedObjectUrl(builder.build()); + } catch (Exception e) { + throw new UtilException("鐢熸垚涓嬭浇URL澶辫触: " + e.getMessage(), e); + } + } } -- Gitblit v1.9.3