Source/UBCS/ubcs-ops-api/ubcs-resource-api/pom.xml
@@ -23,6 +23,12 @@ <groupId>org.springblade</groupId> <artifactId>blade-starter-tenant</artifactId> </dependency> <dependency> <groupId>com.vci.ubcs</groupId> <artifactId>ubcs-util-api</artifactId> <version>3.0.1.RELEASE</version> <scope>compile</scope> </dependency> </dependencies> </project> Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/bo/FileObjectBO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.vci.ubcs.resource.bo; import com.vci.ubcs.resource.vo.FileObjectVO; import lombok.Data; import java.io.InputStream; /** * æä»¶çä¸å¡å¯¹è±¡ * @author weidy * @date 2023/6/9 */ @Data public class FileObjectBO extends FileObjectVO { /** * åºåå */ private static final long serialVersionUID = -4887973911424096779L; /** * æä»¶çæµ */ private InputStream inputStream; /** * æä»¶æ¬å°çä¿¡æ¯ */ private String fileLocalPath; } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileBusConstant.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.vci.ubcs.resource.constant; /** * æä»¶æå¡é¨åçéæå¼ * @author weidy * @date 2023/6/9 */ public class FileBusConstant { /** * æä»¶å¯¹è±¡ */ public static final String FILE_OBJECT = "fileObject"; /** * æä»¶ä¸è½½è®°å½ */ public static final String FILE_DOWNLOAD_RECORD = "fileDownloadRecord"; } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileLifeConstant.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.vci.ubcs.resource.constant; /** * æä»¶ç¶æ * @author weidy * @date 2023/6/9 9:07 */ public class FileLifeConstant { /** * æä»¶çç¶æ */ public static final String FILE = "fileStatus"; } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileObjectDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,54 @@ package com.vci.ubcs.resource.dto; import com.vci.ubcs.resource.entity.FileObject; import com.vci.ubcs.starter.web.pagemodel.BaseModelVO; import lombok.Data; /** * æä»¶æ°æ®ä¼ è¾å¯¹è±¡ * @author weidy * @date 2023/6/9 */ @Data public class FileObjectDTO extends FileObject { /** * åºåå */ private static final long serialVersionUID = 497836915363113260L; /** * æ¯å¦ä¿®æ¹æä»¶ */ private Boolean updateFileFlag ; /** * æä»¶å¤¹è·¯å¾ */ private String dirPath; /** * æä»¶ä¸ä¼ 忝å¦ç«å³çæ */ private Boolean effect = true; /** * ä¸ä¼ åæä»¶è·¯å¾ */ private String sourceFilePath; /** * æ ¡éªç¸åçåç§°çæä»¶ï¼å¿ é¡»å¨ownbizæå¼çæ åµä¸ */ private Boolean checkSameFile = false; /** * æ¡¶çåç§° */ private String bucketName; } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileReleaseDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ package com.vci.ubcs.resource.dto; import lombok.Data; import java.util.List; /** * æä»¶åå¸çæ°æ®æä½å¯¹è±¡ * @author weidy * @date 2023/6/9 */ @Data public class FileReleaseDTO implements java.io.Serializable{ /** * åºåå */ private static final long serialVersionUID = -218379391237684940L; /** * æå±æ°æ®ä¸»é® */ private String ownbizOid; /** * æå±æ°æ®çä¸å¡ç±»å */ private String ownBtmName; /** * æä»¶çä¸»é® */ private List<String> oids; } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileShareDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.vci.ubcs.resource.dto; import lombok.Data; import java.util.List; /** * æä»¶åäº«çæ°æ®ä¼ è¾å¯¹è±¡ * @author weidy * @date 2023/6/9 */ @Data public class FileShareDTO implements java.io.Serializable{ /** * åºåå */ private static final long serialVersionUID = -2947163604655993790L; /** * æ¥æºä¸å¡ */ private String sourceBus; /** * æ¥æºä¸å¡æ°æ®ä¸»é® */ private String sourceBusOid; /** * ç®æ çä¸å¡ */ private String targetBus; /** * ç®æ çä¸å¡æ°æ®ä¸»é® */ private String targetBusOid; /** * æºæä»¶çä¸»é® */ private List<String> oids; } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/FileObject.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,90 @@ package com.vci.ubcs.resource.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.vci.ubcs.starter.revision.model.BaseModel; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; /** * æä»¶å¯¹è±¡ * @author weidy * @date 2023/6/8 */ @Data @TableName("PL_SYS_FILEOBJECT") @ApiModel(value = "æä»¶å¯¹è±¡", description = "åå¨ä¸å¡æ°æ®å ³èçæä»¶ä¿¡æ¯") @EqualsAndHashCode(callSuper = true) public class FileObject extends BaseModel { /** * åºåå */ private static final long serialVersionUID = -7116754635114431150L; /** * æ¾ç¤ºçåç§° */ private String id; /** * æä»¶åç§° */ private String name; /** * å¨minioéçåç§° */ private String objectName; /** * æä»¶åç¼å */ private String fileExtension; /** * ææ¡£ç±»åç¼å· */ private String fileDocClassify; /** * ææ¡£ç±»åææ¬ */ private String fileDocClassifyName; /** * æä»¶å¤§å° */ private Long fileSize; /** * å ³é®è¯ä¿¡æ¯ */ private String keyInfos; /** * æå±æ°æ®ä¸»é® */ private String ownbizOid; /** * æå±æ°æ®çä¸å¡ç±»å */ private String ownBtmName; /** * å ³èçæ°æ®çä¿¡æ¯ */ private String linkInfos; /** * æä»¶çåå¨è·¯å¾ */ private String fileLink; /** * æ¡¶çåç§° */ private String bucketName; } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/life/FileLife.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,84 @@ package com.vci.ubcs.resource.life; import com.vci.ubcs.starter.web.enumpck.BaseEnum; /** * æä»¶çç¶æéå * @author weidy * @date 2023/6/11 */ public enum FileLife implements BaseEnum { /** * åå§å */ INIT("fileInit","åå§å"), /** * ä¸ä¼ ä¸ */ TRANSITING("fileTransiting","ä¸ä¼ ä¸"), /** * ä¸ä¼ 宿 */ TRANS_FINISH("fileTransitFinish","ä¸ä¼ 宿"), /** * å·²çæ */ FILE_RELEASE("fileRelease","å·²çæ"); /** * æä¸¾å¼ */ private String value; /** * æä¸¾æ¾ç¤ºå¼ */ private String text; /** * è·åæä¸¾å¼ * @return æä¸¾å¼ */ @Override public String getValue() { return value; } /** * 设置æä¸¾å¼ * @param value æä¸¾å¼ */ public void setValue(String value) { this.value = value; } /** * è·åæ¾ç¤ºææ¬ * @return æ¾ç¤ºææ¬ */ @Override public String getText() { return text; } /** * 设置æ¾ç¤ºææ¬ * @param text æ¾ç¤ºææ¬ */ public void setText(String text) { this.text = text; } /** * æä¸¾å é¨æé æ¹æ³ * @param value æä¸¾å¼ * @param text æ¾ç¤ºææ¬ */ private FileLife(String value, String text){ this.value = value; this.text = text; } } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/query/FileQuery.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,34 @@ package com.vci.ubcs.resource.query; import com.vci.ubcs.resource.entity.FileObject; import com.vci.ubcs.starter.web.pagemodel.BladeQueryObject; import lombok.Data; import java.util.Date; /** * æä»¶çæ¥è¯¢ * @author weidy * @date 2023/1/31 */ @Data public class FileQuery extends FileObject { /** * åºåå */ private static final long serialVersionUID = 2442917107957942183L; /** * å建æ¶é´ */ private Date createTime_begin; /** * å建æ¶é´ç»æ */ private Date createTime_end; } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,80 @@ package com.vci.ubcs.resource.utils; import com.vci.ubcs.resource.bo.FileObjectBO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.springframework.http.MediaType; import org.springframework.http.MediaTypeFactory; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; /** * ä¸è½½æä»¶çå·¥å · * @author weidy * @date 2023/6/9 */ @Slf4j public class FileDownloadUtil { /** * ä¸è½½æä»¶ * @param response ååºå¯¹è±¡ * @param fileObjectBO æä»¶çä¿¡æ¯ï¼å 嫿件çè¾å ¥æµ * @throws IOException ä¸è½½å¼å¸¸ä¼æåº */ public static void downloadFile(HttpServletResponse response, FileObjectBO fileObjectBO) throws IOException { downloadFile(response,fileObjectBO,true); } /** * ä¸è½½æä»¶ * @param response ååºå¯¹è±¡ * @param fileObjectBO æä»¶çä¿¡æ¯ï¼å 嫿件çè¾å ¥æµ * @param closeInputStream æ¯å¦å ³éæµ * @throws IOException ä¸è½½åºéçæ¶åæåºå¼å¸¸ */ public static void downloadFile(HttpServletResponse response, FileObjectBO fileObjectBO,boolean closeInputStream) throws IOException { MediaType mediaType = MediaTypeFactory.getMediaType(fileObjectBO.getName() + "." + fileObjectBO.getFileExtension()).orElse(MediaType.APPLICATION_OCTET_STREAM); // 设置强å¶ä¸è½½ä¸æå¼ response.setContentType(mediaType.getType()); try{ String fileName = URLEncoder.encode(fileObjectBO.getName() + "." + fileObjectBO.getFileExtension(), "UTF8"); response.addHeader("Content-Disposition", "attachment; filename="+ fileName+ ";filename*=utf-8''" + fileName); }catch(Exception e){ if(log.isErrorEnabled()){ log.error("设置æä»¶çåç§°å°ååºæµçæ¶ååºé",e); } } response.setCharacterEncoding("UTF-8"); Cookie cookie = new Cookie("fileDownload", "true"); cookie.setPath("/"); response.addCookie(cookie); if(closeInputStream) { try (InputStream ins = (fileObjectBO.getInputStream() != null ? fileObjectBO.getInputStream() : new FileInputStream(fileObjectBO.getFileLocalPath()))) { IOUtils.copy(ins, response.getOutputStream()); } catch (IOException e) { //æå¯è½å®¢æ·ç«¯ç龿¥ if (log.isErrorEnabled()) { log.error("åå ¥æä»¶å°ååºæµåºé", e); } throw e; } }else{ try { InputStream ins = (fileObjectBO.getInputStream() != null ? fileObjectBO.getInputStream() : new FileInputStream(fileObjectBO.getFileLocalPath())); IOUtils.copy(ins, response.getOutputStream()); } catch (IOException e) { //æå¯è½å®¢æ·ç«¯ç龿¥ if (log.isErrorEnabled()) { log.error("åå ¥æä»¶å°ååºæµåºé", e); } throw e; } } } } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,388 @@ package com.vci.ubcs.resource.utils; import com.vci.ubcs.starter.exception.VciBaseException; import com.vci.ubcs.starter.web.util.VciBaseUtil; import org.apache.commons.io.IOUtils; import org.springframework.boot.system.ApplicationHome; import org.springframework.util.StringUtils; import java.io.*; import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * æ¬å°æä»¶æä½ç±» * @author weidy * @date 2021-04-19 */ public class FileUtil { /** * å 餿件夹 * @param file è¦å é¤çæä»¶æè æä»¶å¤¹ */ public static void deleteFile(File file) { if(file == null || !file.exists()){ return; } if (file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { deleteFile(files[i]); } } file.delete(); } /** * æ·è´æä»¶ * @param source æºæä»¶ * @param target ç®æ æä»¶ * @throws VciBaseException æ·è´æä»¶åºéçæ¶å伿åºå¼å¸¸ */ public static void copyFile(File source, File target) throws VciBaseException { try(FileInputStream is = new FileInputStream(source); FileOutputStream os = new FileOutputStream(target)){ FileChannel sourceChannel = is.getChannel(); FileChannel targetChannel = os.getChannel(); int i=0; int length=2097152; while(true){ if(sourceChannel.position()==sourceChannel.size()){ sourceChannel.close(); targetChannel.close(); break; } if((sourceChannel.size()-sourceChannel.position())<20971520) { length = (int) (sourceChannel.size() - sourceChannel.position()); }else { length = 20971520; } sourceChannel.transferTo(sourceChannel.position(),length,targetChannel); sourceChannel.position(sourceChannel.position()+length); i++; } }catch(Throwable e){ throw new VciBaseException("æ·è´æä»¶åºé",new String[0],e); } } /** * ä¸´æ¶æä»¶å¤¹çåç¼ */ public static String DEFAULT_TEMP_FOLDER_PREFIX = ""; /** * è·åé»è®¤çä¸´æ¶æä»¶å¤¹ * @return ä¸´æ¶æä»¶å¤¹ï¼é»è®¤ä¸ºå½å项ç®çè¿è¡è·¯å¾ä¸çtempFolderä¸çéæºå¼ */ public static String getDefaultTempFolder() throws VciBaseException{ String path = (!StringUtils.hasLength(DEFAULT_TEMP_FOLDER_PREFIX)?getProjectFolder():DEFAULT_TEMP_FOLDER_PREFIX) + File.separator + "temp" + File.separator + VciBaseUtil.getPk(); File folder = new File(path); if(!folder.exists()){ folder.mkdirs(); } return path; } /** * è·å项ç®çè·¯å¾ * @return 项ç®çè·¯å¾ * @throws VciBaseException è·åè·¯å¾åºç°äºéè¯¯ä¼æåºå¼å¸¸ */ public static String getProjectFolder() throws VciBaseException{ return getProjectFolder(FileUtil.class); } /** * è·åæä¸ªclassæå¨é¡¹ç®çè·¯å¾ * @param classObj æä¸ªclass * @return 项ç®çè·¯å¾ * @throws VciBaseException è·åè·¯å¾åºç°äºéè¯¯ä¼æåºå¼å¸¸ */ public static String getProjectFolder(Class classObj) throws VciBaseException{ String path = ""; try { ApplicationHome h = new ApplicationHome(classObj == null? FileUtil.class:classObj); File jarF = h.getSource(); if(jarF == null){ jarF = h.getDir(); } path = jarF.getParentFile().toString(); if(path.contains("!")){ path = new File(path).getParentFile().getParent(); } }catch (Throwable e){ throw new VciBaseException("è·åå½åæå¡æå¨çæä»¶å¤¹åºç°äºé误",new String[0],e); } if(path.startsWith("file:\\")){ path = path.substring(6); } if (System.getProperty("os.name").toLowerCase().startsWith("win") && path.startsWith("/")) { path = path.substring(path.indexOf("/") + 1); } return path; } /** * å é¤ä¸´æ¶æä»¶ * @param tempFile ä¸´æ¶æä»¶ * @param deleteRandomFolder æ¯å¦å é¤éæºçé£ä¸ªæä»¶å¤¹ * @throws VciBaseException å é¤åºéçæ¶åæåºå¼å¸¸ */ public static void deleteTempFile(File tempFile,boolean deleteRandomFolder) throws VciBaseException{ if(tempFile!=null){ tempFile.delete(); if(deleteRandomFolder){ tempFile.getParentFile().delete(); } } } /** * 夿忰æ¯å¦ä¸ºç©º * @param s åæ°ï¼ç¬¬ä¸ä¸ªä¸ºåæ°ï¼ç¬¬äºä¸ªä¸ºæç¤ºä¿¡æ¯ * @throws VciBaseException ä¸ºç©ºæ¶æåºè¿ä¸ªå¼å¸¸ */ public static void alertNotNull(Object... s) throws VciBaseException{ if(s!=null && s.length>0){ for(int i = 0 ; i < s.length ; i ++){ Object obj = s[i]; if(obj==null ||!StringUtils.hasLength(obj.toString())){ String param = ""; try{ i++; param = s[i].toString(); }catch(Exception e){ } throw new VciBaseException("åæ°[" + param + "]ä¸è½ä¸ºç©º"); } } } } /** * è·åæä»¶çåç¼å * @param file æä»¶å¯¹è±¡ * @return åç¼åï¼ä¸å å«.ï¼å¦ææä»¶ä¸åå¨æè æ²¡æåç¼åè¿å"" */ public static String getFileExtension(File file){ if(file!=null){ return getFileExtensionByName(file.getName()); } return ""; } /** * è·åæä»¶ä¸å«åç¼åçåç§° * @param file æä»¶ * @return åç§° */ public static String getFileNameUnHasExtension(File file){ if(file!=null){ String name = file.getName(); return name.contains(".")?name.substring(0,name.lastIndexOf(".")):name; } return ""; } /** * è·åæä»¶ä¸å«åç¼åçåç§° * @param fileName æä»¶åç§° * @return åç§° */ public static String getFileNameUnHasExtensionByName(String fileName){ if(fileName!=null){ return fileName.contains(".")?fileName.substring(0,fileName.lastIndexOf(".")):fileName; } return ""; } /** * è·åæä»¶çåç¼å * @param name æä»¶åç§° * @return åç¼åï¼ä¸å å«.ï¼æ²¡æåç¼åè¿å"" */ public static String getFileExtensionByName(String name){ if(StringUtils.hasLength(name)){ if(name.contains(".")){ return name.substring(name.lastIndexOf(".")+1); } } return ""; } /** * è·åä¸ä¼ æä»¶çåç§°ï¼å¨IEæµè§å¨ä¸ï¼ä¸ä¼ ä¼æå ¨è·¯å¾å¸¦è¿æ¥ * @param name æä»¶çåç§° * @return æ¿æ¢åçå¼ */ public static String getFileNameForIE(String name){ if(!StringUtils.hasLength(name)){ return name; } if(name.contains(File.separator)){ return name.substring(name.lastIndexOf(File.separator)+1); } if(name.contains("\\")){ return name.substring(name.lastIndexOf("\\") + 1); } return name; } /** * ä»å·¥ç¨ä¸è¯»åæä»¶çå 容 * @param fileName æä»¶çåç§° * @return æä»¶çå 容 * @throws VciBaseException 读ååºéçæ¶å伿åºå¼å¸¸ */ public static String readContentForFileInJar(String fileName) throws VciBaseException{ if(!StringUtils.hasLength(fileName)){ throw new VciBaseException("æä»¶å为空"); } if(!fileName.startsWith("/")){ fileName = "/" + fileName; } InputStream in = null; ByteArrayOutputStream os = null; try{ in = FileUtil.class.getResourceAsStream( fileName); if(in ==null){ in=Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName); } os = new ByteArrayOutputStream(); IOUtils.copy(in,os); return new String(os.toByteArray(),"UTF-8"); }catch (Throwable e){ throw new VciBaseException("读åæä»¶çå 容åºç°äºé误",new String[0],e); }finally { IOUtils.closeQuietly(in); IOUtils.closeQuietly(os); } } /** * 读åæä»¶çå å®¹ï¼æä»¶ä¸è½æ¯jaréç * @param fileName æä»¶çåç§° * @return æä»¶çå å®¹ï¼æ¯UTF-8çå符é * @throws VciBaseException æä»¶ä¸åå¨ï¼å读ååºéçæ¶å伿åºå¼å¸¸ */ public static String readContentForFile(String fileName) throws VciBaseException{ return new String(readDataForFile(fileName),StandardCharsets.UTF_8); } /** * 读åæä»¶éçæ°æ® * @param fileName æä»¶åç§° * @return æä»¶çæ°æ® * @throws VciBaseException æä»¶ä¸åå¨ï¼åè·ååºéçæ¶å伿åºå¼å¸¸ */ public static byte[] readDataForFile(String fileName) throws VciBaseException{ File file = new File(fileName); if(!file.exists()){ throw new VciBaseException("æä»¶æªæ¾å°ï¼{0}",new String[]{fileName}); } try(InputStream in = new FileInputStream( file); ByteArrayOutputStream os = new ByteArrayOutputStream(); ){ IOUtils.copy(in,os); return os.toByteArray(); }catch (Throwable e){ throw new VciBaseException("读åæä»¶çå 容åºç°äºé误",new String[0],e); } } /** * åå ¥åç¬¦ä¸²å°æä»¶ * @param content å符串 * @param fileName æä»¶çåç§° * @throws VciBaseException åå ¥åºéçæ¶å伿åºå¼å¸¸ */ public static void writeContentToFile(String content,String fileName) throws VciBaseException{ File file = new File(fileName); if(!file.exists()){ File parentFile = file.getParentFile(); if(!parentFile.exists()){ parentFile.mkdirs(); } try { file.createNewFile(); } catch (IOException e) { throw new VciBaseException("åå ¥æä»¶çå 容æ¶ååºç°äºå建æä»¶å¤±è´¥çé®é¢,{}",new String[]{fileName},e); } } if(content == null){ content = ""; } try(OutputStream os = new FileOutputStream(file);){ os.write(content.getBytes(StandardCharsets.UTF_8)); os.flush(); }catch(Throwable e){ throw new VciBaseException("åå ¥æä»¶çå 容æ¶ååºç°äºåé误,{}",new String[]{fileName},e); } } /** * ä»é¡¹ç®éæè jarçæä»¶å°ç®æ æä»¶ * @param fileInJar jaræè 项ç®éçæä»¶åç§° * @param target ç®æ æä»¶ * @throws VciBaseException æ·è´æä»¶åºç°éè¯¯çæ¶å伿åºå¼å¸¸ */ public static void copyFileInJar(String fileInJar,String target) throws VciBaseException{ alertNotNull(fileInJar,"æºæä»¶",target,"ç®æ æä»¶"); File targetFile = new File(target); File folder = targetFile.getParentFile(); if(!folder.exists()){ folder.mkdirs(); } if(!targetFile.exists()){ try { targetFile.createNewFile(); } catch (IOException e) { throw new VciBaseException("åå»ºç®æ æä»¶çåºç°äºé误",new String[0],e); } } if(!fileInJar.startsWith("/")){ fileInJar = "/" + fileInJar; } InputStream in = null; FileOutputStream os = null; try{ in = FileUtil.class.getResourceAsStream( fileInJar); if(in ==null){ in=Thread.currentThread().getContextClassLoader().getResourceAsStream(fileInJar); } os = new FileOutputStream(target); IOUtils.copy(in,os); }catch (Throwable e){ throw new VciBaseException("æ·è´æä»¶çå 容åºç°äºé误.{0},{1}",new String[]{fileInJar,target},e); }finally { IOUtils.closeQuietly(in); IOUtils.closeQuietly(os); } } /** * æä»¶è½¬æ¢ä¸ºè·¯å¾ * @param fileList æä»¶å表 * @return è·¯å¾å表 * @throws VciBaseException åæ°ä¸ºç©ºåæä»¶ä¸åå¨ä¼æåºå¼å¸¸ */ public static List<String> fileToPatch(Collection<File> fileList) throws VciBaseException { alertNotNull("æä»¶å表",fileList); List<String> filePath = new ArrayList<>(); for(File file : fileList){ if(!file.exists()){ throw new VciBaseException(file.getAbsolutePath() + "æä»¶æ²¡ææ¾å°",new String[0]); } filePath.add(file.getAbsolutePath()); } return filePath; } } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/ZipUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,155 @@ package com.vci.ubcs.resource.utils; import com.vci.ubcs.starter.exception.VciBaseException; import com.vci.ubcs.starter.web.util.LangBaseUtil; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.nio.charset.Charset; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * zipç¸å ³çå·¥å ·ç±» * @author wanghong * @date 2021-02-02 */ @Component public class ZipUtil { /** * è·åzipçå符é * @return é»è®¤ä¸ºGBKï¼å¦åéè¦é ç½® */ private String getZipCharset(){ return (File.separatorChar=='\\')?"GBK":"UTF-8"; } /** * 尿件夹å缩æå缩å * @param folder æä»¶å¤¹è·¯å¾ * @param zipFileName zipæä»¶å * @throws VciBaseException åæ°ä¸ºç©ºæè æ·»å åºéç伿åºå¼å¸¸ */ public void folderToZipFile(String folder, String zipFileName) throws VciBaseException { folderToZipFile(folder,zipFileName,getZipCharset()); } /** * 尿件夹å缩æå缩å * @param folder æä»¶å¤¹è·¯å¾ * @param zipFileName zipæä»¶å * @param zipEncode zipçå符éï¼windowsåºè¯¥ä¸ºGBK * @throws VciBaseException åæ°ä¸ºç©ºæè æ·»å åºéç伿åºå¼å¸¸ */ public void folderToZipFile(String folder, String zipFileName,String zipEncode) throws VciBaseException{ File sourceFile = new File(folder); if(!sourceFile.exists()){ throw new VciBaseException("æä»¶{0}æ²¡ææ¾å°",new String[]{folder}); } try( ZipOutputStream zos =new ZipOutputStream(new FileOutputStream(zipFileName), StringUtils.hasLength(zipEncode)?Charset.forName(zipEncode): Charset.forName(getZipCharset()));) { //é»è®¤æ¯UTF-8æ ¼å¼ç addFileToZip(zos, new File(folder).listFiles(),folder + File.separator); }catch (Throwable e){ throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{}); } } /** * 尿件夹å缩æå缩å * @param zos zipè¾åºæµ * @param files è¦å缩çæä»¶ * @param rootPath å缩çæä»¶ä¸çé¡¶å±ç®å½ * @throws VciBaseException æä»¶ä¸åå¨ï¼æè å 容åºç°éè¯¯ä¼æåºå¼å¸¸ */ private void addFileToZip(ZipOutputStream zos,File[] files,String rootPath) throws VciBaseException{ if(files!=null && files.length>0) { for (File file : files) { if(!StringUtils.hasLength(rootPath)){ try { rootPath = file.getParent(); if (rootPath == null) { rootPath = file.getPath(); } }catch (Throwable e){ rootPath = file.getPath(); } } if (!file.exists()) { throw new VciBaseException("æä»¶{0}æ²¡ææ¾å°",new String[]{file.getAbsolutePath()}); } if (file.isDirectory()) { addFileToZip(zos, file.listFiles(),rootPath); }else{ try (InputStream is = new FileInputStream(file); ){ String entryName = file.getAbsolutePath().replace(rootPath,""); if(entryName.startsWith("\\")) { entryName = entryName.substring(1); } ZipEntry zipEntry = new ZipEntry(entryName); zos.putNextEntry(zipEntry); byte[] b = new byte[100]; int length = 0; while ((length = is.read(b)) != -1) { zos.write(b, 0, length); } } catch (Exception e) { throw new VciBaseException("ZIPå缩åºé{0}",new String[]{file.getAbsolutePath()},e); } } } } } /** * å°å个æä»¶æ·»å å°zipä¸ * @param file æä»¶ * @param zipFile zipæä»¶ * @throws VciBaseException åæ°ä¸ºç©ºæè æ·»å åºéç伿åºå¼å¸¸ */ public void addFileToZip(File file, String zipFile) throws VciBaseException{ if(file == null || !file.exists() ){ throw new VciBaseException("æä»¶{0}æ²¡ææ¾å°" ,new String[]{file.getAbsolutePath()}); } if(!StringUtils.hasLength(zipFile)){ throw new VciBaseException("zipæä»¶{0}为空",new String[0]); } addFileToZip(new File[]{file},zipFile); } /** * å°å¤ä¸ªä¸ªæä»¶æ·»å å°zipä¸ * @param files æä»¶ * @param zipFile zipæä»¶ * @throws VciBaseException åæ°ä¸ºç©ºæè æ·»å åºéç伿åºå¼å¸¸ */ public void addFileToZip(File[] files, String zipFile) throws VciBaseException{ addFileToZip(files, zipFile,getZipCharset()); } /** * å°å¤ä¸ªä¸ªæä»¶æ·»å å°zipä¸ * @param files æä»¶ * @param zipFile zipæä»¶ * @param zipEncode zipçå符é * @throws VciBaseException åæ°ä¸ºç©ºæè æ·»å åºéç伿åºå¼å¸¸ */ public void addFileToZip(File[] files, String zipFile,String zipEncode) throws VciBaseException{ if(files == null || files.length == 0){ throw new VciBaseException("æä»¶{0}å 容æ¯ç©º",new String[0]); } if(!StringUtils.hasLength(zipFile)){ throw new VciBaseException("zipæä»¶{0}æ¯ç©º",new String[0]); } try (ZipOutputStream zos =new ZipOutputStream(new FileOutputStream(zipFile), StringUtils.hasLength(zipEncode)?Charset.forName(zipEncode): Charset.forName(getZipCharset()));){ addFileToZip(zos, files,""); }catch (Throwable e){ throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e); } } } Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/vo/FileObjectVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.vci.ubcs.resource.vo; import com.vci.ubcs.resource.entity.FileObject; import lombok.Data; /** * æä»¶çæ¾ç¤ºå¯¹è±¡ * @author weidy * @date 2023/6/9 */ @Data public class FileObjectVO extends FileObject { /** * åºåå */ private static final long serialVersionUID = 2685482161288133481L; } Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/AttachController.java
@@ -38,6 +38,8 @@ /** * é件表 æ§å¶å¨ * * * * @author Chill */ @NonDS Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,170 @@ package com.vci.ubcs.resource.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.vci.ubcs.resource.dto.FileObjectDTO; import com.vci.ubcs.resource.dto.FileReleaseDTO; import com.vci.ubcs.resource.dto.FileShareDTO; import com.vci.ubcs.resource.query.FileQuery; import com.vci.ubcs.resource.service.IFileService; import com.vci.ubcs.resource.utils.FileDownloadUtil; import com.vci.ubcs.resource.vo.FileObjectVO; import com.vci.ubcs.starter.web.util.LangBaseUtil; import com.vci.ubcs.starter.web.util.VciBaseUtil; import org.springblade.core.mp.support.Query; import org.springblade.core.oss.MinioTemplate; import org.springblade.core.tool.api.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.Collection; import java.util.List; /** * æä»¶æ§å¶å¨ * @author weidy * @date 2023-6/9 */ @RestController() @RequestMapping("/fileController") public class FileController { /** * æä»¶æå¡ */ @Autowired private IFileService fileService; /** * minioçé ç½® */ @Autowired private MinioTemplate minioTemplate; /** * æ ¹æ®æä»¶ä¸»é®ä¸è½½æä»¶ * @param fileOids æä»¶çä¸»é® * @param response ååºç对象 * @return æ§è¡ç»æï¼åªæä¸è½½å¤±è´¥çæ¶åæä¼è¿æ · */ @RequestMapping(value = "/downloadFilesByOids",method = {RequestMethod.GET,RequestMethod.POST}) public R downloadFilesByOids(@RequestParam String fileOids, HttpServletResponse response){ try{ FileDownloadUtil.downloadFile(response, fileService.downloadFileByOids(VciBaseUtil.str2List(fileOids))); }catch (Throwable e){ return R.fail(LangBaseUtil.getErrorMsg(e)); } return R.success("ä¸è½½å®æ"); } /** * æä»¶å é¤ * @param oids æä»¶çä¸»é® * @return æä»¶å 容 */ @DeleteMapping("/deleteFile") public R deleteFile(@RequestBody Collection<String> oids){ fileService.deleteFiles(oids); return R.success("å 餿å"); } /** * å端页é¢åæä»¶ä¸ä¼ ã(å æ°æ®ï¼åæä»¶æ¨¡å¼ä¸ä¼ ) * @param file ä¸ä¼ çæä»¶ * @param fileObjectDTO æä»¶ä¿¡æ¯ä¼ è¾å¯¹è±¡ * @return æä»¶ä¿¡æ¯æ¾ç¤ºå¯¹è±¡ */ @PostMapping("/uploadFile") public R<FileObjectVO> uploadFile(MultipartFile file, FileObjectDTO fileObjectDTO){ if (file != null ) { return fileService.uploadFile(file, fileObjectDTO); } else { return R.fail("æ ä¸ä¼ çæä»¶"); } } /** * å¨ä¸ä¼ æä»¶åï¼ä¿åæä»¶çä¿¡æ¯ * @param fileObjectDTO æä»¶ä¿¡æ¯ä¼ è¾å¯¹è±¡ * @return æä»¶ä¿¡æ¯æ¾ç¤ºå¯¹è±¡ */ @PostMapping("/saveFileAfterUpload") public R<FileObjectVO> saveFileAfterUpload( @RequestBody FileObjectDTO fileObjectDTO){ return fileService.saveFileAfterUpload(fileObjectDTO); } /** * å°åæ°æ®ä¸çæææä»¶å ±äº«å°å ¶ä»çä¸å¡æ°æ®ä¸ * @param shareDTO æä»¶å享 * @return æä»¶ä¿¡æ¯æ¾ç¤ºå¯¹è±¡,æ¯å¤ä¸ª */ @PostMapping("/shareFiles") public R<List<FileObjectVO>> shareFiles(@RequestBody FileShareDTO shareDTO){ return fileService.shareFiles(shareDTO); } /** * ä¿®æ¹æä»¶ä¿¡æ¯(ä¸å«æä»¶),注æobjectNameåfilePathä¸ä¼åå * @param fileDTOs æä»¶çæ°æ®å¯¹è±¡ * @return æ§è¡ç»æ */ @PostMapping("/updateFileInfos") public R updateFileInfos(@RequestBody Collection<FileObjectDTO> fileDTOs){ return fileService.updateFileInfos(fileDTOs); } /** * æä»¶çæ * @param ids æä»¶çä¸»é® * @return æ§è¡ç»æ */ @PutMapping("/releasedFiles") public R releasedFiles(@RequestBody Collection<String> ids){ return fileService.releasedFiles(ids); } /** * æ¹éæå®æä»¶ä¸å¡æ°æ®åçæ * @param releaseDTOS çæçç¸å ³ä¿¡æ¯ * @return æ§è¡ç»æ */ @PutMapping("/releasedFilesForOwn") public R releasedFilesForOwn(@RequestBody Collection<FileReleaseDTO> releaseDTOS){ return fileService.releasedFilesForOwn(releaseDTOS); } /** * 使ç¨ä¸å¡ç±»åæ¥è¯¢æä»¶çä¿¡æ¯ï¼æä¾ç»é¡µé¢è°ç¨ * @param fileQuery æ¥è¯¢å¯¹è±¡ * @return æä»¶çæ¾ç¤ºå¯¹è±¡ */ @RequestMapping(value = "/listFiles",method = {RequestMethod.GET,RequestMethod.POST}) public R<IPage<FileObjectVO>> listFiles(FileQuery fileQuery, Query query){ return R.data(fileService.listFiles(fileQuery,query)); } /** * ä½¿ç¨æä»¶ä¸»é®è·å对象 * @param oid ä¸»é® * @return æä»¶æ¾ç¤ºå¯¹è±¡ */ @GetMapping("/get") public FileObjectVO get(String oid){ return fileService.get(oid); } /** * ä½¿ç¨æä»¶ç䏻鮿¹éè·å对象 * @param oids æä»¶ç主é®éå * @return æä»¶çæ¾ç¤ºä¿¡æ¯ */ @GetMapping("/listFilesByOids") public List<FileObjectVO> listFilesByOids( Collection<String> oids){ return fileService.listFilesByOids(oids); } } Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/endpoint/OssEndpoint.java
@@ -17,6 +17,10 @@ package com.vci.ubcs.resource.endpoint; import com.vci.ubcs.resource.entity.Attach; import com.vci.ubcs.resource.service.IFileService; import com.vci.ubcs.resource.utils.FileDownloadUtil; import com.vci.ubcs.starter.web.util.LangBaseUtil; import com.vci.ubcs.starter.web.util.VciBaseUtil; import io.swagger.annotations.Api; import lombok.AllArgsConstructor; import lombok.SneakyThrows; @@ -28,11 +32,16 @@ import org.springblade.core.tool.utils.Func; import com.vci.ubcs.resource.builder.oss.OssBuilder; import com.vci.ubcs.resource.service.IAttachService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; /** * 对象åå¨ç«¯ç¹ * * è¿ä¸ªç±»ä¸ä½¿ç¨ï¼ç»ä¸ç¨fileController * * @author Chill */ @@ -41,6 +50,7 @@ @AllArgsConstructor @RequestMapping("/oss/endpoint") @Api(value = "对象åå¨ç«¯ç¹", tags = "对象åå¨ç«¯ç¹") @Deprecated public class OssEndpoint { /** @@ -52,6 +62,7 @@ * é件表æå¡ */ private final IAttachService attachService; /** * å建å卿¡¶ @@ -68,7 +79,7 @@ } /** * å建å卿¡¶ * å é¤å卿¡¶ * * @param bucketName å卿¡¶åç§° * @return R @@ -107,6 +118,7 @@ public R<OssFile> statFile(@RequestParam String fileName) { return R.data(ossBuilder.template().statFile(fileName)); } /** * è·åæä»¶ç¸å¯¹è·¯å¾ @@ -160,37 +172,37 @@ return R.data(bladeFile); } /** * ä¸ä¼ æä»¶å¹¶ä¿åè³é件表 * * @param file æä»¶ * @return ObjectStat */ @SneakyThrows @PostMapping("/put-file-attach") public R<BladeFile> putFileAttach(@RequestParam MultipartFile file) { String fileName = file.getOriginalFilename(); BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); Long attachId = buildAttach(fileName, file.getSize(), bladeFile); bladeFile.setAttachId(attachId); return R.data(bladeFile); } // /** // * ä¸ä¼ æä»¶å¹¶ä¿åè³é件表 // * // * @param file æä»¶ // * @return ObjectStat // */ // @SneakyThrows // @PostMapping("/put-file-attach") // public R<BladeFile> putFileAttach(@RequestParam MultipartFile file) { // String fileName = file.getOriginalFilename(); // BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); // Long attachId = buildAttach(fileName, file.getSize(), bladeFile); // bladeFile.setAttachId(attachId); // return R.data(bladeFile); // } /** * ä¸ä¼ æä»¶å¹¶ä¿åè³é件表 * * @param fileName å卿¡¶å¯¹è±¡åç§° * @param file æä»¶ * @return ObjectStat */ @SneakyThrows @PostMapping("/put-file-attach-by-name") public R<BladeFile> putFileAttach(@RequestParam String fileName, @RequestParam MultipartFile file) { BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); Long attachId = buildAttach(fileName, file.getSize(), bladeFile); bladeFile.setAttachId(attachId); return R.data(bladeFile); } // /** // * ä¸ä¼ æä»¶å¹¶ä¿åè³é件表 // * // * @param fileName å卿¡¶å¯¹è±¡åç§° // * @param file æä»¶ // * @return ObjectStat // */ // @SneakyThrows // @PostMapping("/put-file-attach-by-name") // public R<BladeFile> putFileAttach(@RequestParam String fileName, @RequestParam MultipartFile file) { // BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); // Long attachId = buildAttach(fileName, file.getSize(), bladeFile); // bladeFile.setAttachId(attachId); // return R.data(bladeFile); // } /** * æå»ºé件表 Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/mapper/FileObjectMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.vci.ubcs.resource.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.vci.ubcs.resource.entity.FileObject; /** * æä»¶çæ°æ®æä½ç±» * @author weidy * @date 2023/6/9 */ public interface FileObjectMapper extends BaseMapper<FileObject> { } Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/IFileService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,111 @@ package com.vci.ubcs.resource.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.vci.ubcs.resource.bo.FileObjectBO; import com.vci.ubcs.resource.dto.FileObjectDTO; import com.vci.ubcs.resource.dto.FileReleaseDTO; import com.vci.ubcs.resource.dto.FileShareDTO; import com.vci.ubcs.resource.entity.FileObject; import com.vci.ubcs.resource.query.FileQuery; import com.vci.ubcs.resource.vo.FileObjectVO; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.util.Collection; import java.util.List; /** * æä»¶çæå¡ * @author weidy * @date 2023/1/31 */ public interface IFileService extends IService<FileObject> { /** * ä¸è½½ï¼æ³¨æå¤ä¸ªæä»¶çæ¶åï¼ä¼èªå¨ä¸è½½ä¸ºä¸ä¸ªå缩å * @param oids 主é®éå * @return æä»¶çä¿¡æ¯ */ FileObjectBO downloadFileByOids(Collection<String> oids); /** * å 餿件 * @param oids 主é®éå * @return æ§è¡ç»æ */ void deleteFiles(Collection<String> oids); /** * ä¸ä¼ æä»¶ * @param file æä»¶çä¿¡æ¯ * @param fileObjectDTO æä»¶çç¸å ³ä¿¡æ¯ * @return æä»¶ä¸ä¼ åçä¿¡æ¯ */ R<FileObjectVO> uploadFile(MultipartFile file, FileObjectDTO fileObjectDTO); /** * ä¿®æ¹æä»¶çä¿¡æ¯ï¼ä¸ä¼æ¹objectNameåfilePath) * @param fileDTOs æä»¶çä¿¡æ¯ * @return ä¿®æ¹åçä¿¡æ¯ */ R<List<FileObjectVO>> updateFileInfos(Collection<FileObjectDTO> fileDTOs); FileObjectVO do2Vo(FileObject fileObject); List<FileObjectVO> do2Vos(Collection<FileObject> fileObjects); /** * å享æä»¶å°å ¶ä»æ°æ®ä¸ * * @param shareDTO æ¥æºä¸å¡ * @return å享åçæä»¶ä¿¡æ¯ */ R<List<FileObjectVO>> shareFiles(FileShareDTO shareDTO); /** * æä»¶å表æ¥è¯¢ * @param fileQuery æä»¶æ¥è¯¢ * @param query å页æ¥è¯¢å¯¹è±¡ * @return æä»¶çæ¾ç¤ºä¿¡æ¯ */ IPage<FileObjectVO> listFiles(FileQuery fileQuery, Query query); /** * ä½¿ç¨æä»¶ç䏻鮿¹éè·å对象 * @param oids æä»¶ç主é®éå * @return æä»¶çæ¾ç¤ºä¿¡æ¯ */ List<FileObjectVO> listFilesByOids(Collection<String> oids); /** * æä»¶çæ * @param oids 主é®éå * @return æ§è¡ç»æ */ R releasedFiles(Collection<String> oids); /** * æ¹éæå®æä»¶ä¸å¡æ°æ®åçæ * @param releaseDTOS çæçç¸å ³ä¿¡æ¯ * @return æ§è¡ç»æ */ R releasedFilesForOwn(Collection<FileReleaseDTO> releaseDTOS); /** * å¨ä¸ä¼ æä»¶åï¼ä¿åæä»¶çä¿¡æ¯ * @param fileObjectDTO æä»¶ä¿¡æ¯ä¼ è¾å¯¹è±¡ * @return æä»¶ä¿¡æ¯æ¾ç¤ºå¯¹è±¡ */ R<FileObjectVO> saveFileAfterUpload(FileObjectDTO fileObjectDTO); /** * è·å对象 * @param oid ä¸»é® * @return æä»¶çæ¾ç¤ºå¯¹è±¡ */ FileObjectVO get(String oid); } Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/impl/FileServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,536 @@ package com.vci.ubcs.resource.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vci.ubcs.resource.bo.FileObjectBO; import com.vci.ubcs.resource.dto.FileObjectDTO; import com.vci.ubcs.resource.dto.FileReleaseDTO; import com.vci.ubcs.resource.dto.FileShareDTO; import com.vci.ubcs.resource.entity.Attach; import com.vci.ubcs.resource.entity.FileObject; import com.vci.ubcs.resource.life.FileLife; import com.vci.ubcs.resource.mapper.FileObjectMapper; import com.vci.ubcs.resource.query.FileQuery; import com.vci.ubcs.resource.service.IFileService; import com.vci.ubcs.resource.utils.FileUtil; import com.vci.ubcs.resource.utils.ZipUtil; import com.vci.ubcs.resource.vo.FileObjectVO; import com.vci.ubcs.starter.exception.VciBaseException; import com.vci.ubcs.starter.web.enumpck.BaseEnum; import com.vci.ubcs.starter.web.enumpck.UserSecretEnum; import com.vci.ubcs.starter.web.util.BeanUtil; import com.vci.ubcs.starter.web.util.VciBaseUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.oss.MinioTemplate; import org.springblade.core.oss.OssTemplate; import org.springblade.core.oss.model.BladeFile; import org.springblade.core.oss.model.OssFile; import org.springblade.core.oss.props.OssProperties; import org.springblade.core.oss.rule.OssRule; import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; /** * æä»¶æå¡ * @author weidy * @date 2023/2/1 */ @Service @Slf4j public class FileServiceImpl extends ServiceImpl<FileObjectMapper, FileObject> implements IFileService { /** * æä»¶çæ°æ®æä½ç±» */ @Resource private FileObjectMapper fileObjectMapper; /** * å¯¹è±¡çæ¨¡ç */ @Autowired private OssTemplate ossTemplate; /** * æä»¶æå¡çé ç½® */ @Autowired private OssProperties ossProperties; /** * å缩æä»¶çå·¥å ·ç±» */ @Autowired private ZipUtil zipUtil; /*** * æä»¶çè§å */ @Autowired private OssRule ossRule; /** * ä¸è½½ï¼æ³¨æå¤ä¸ªæä»¶çæ¶åï¼ä¼èªå¨ä¸è½½ä¸ºä¸ä¸ªå缩å * * @param oids 主é®éå * @return æä»¶çä¿¡æ¯ */ @Override public FileObjectBO downloadFileByOids(Collection<String> oids) { VciBaseUtil.alertNotNull(oids,"æä»¶ç主é®éå"); if(log.isDebugEnabled()){ log.debug("ä¸è½½æä»¶,",oids.stream().collect(Collectors.joining(","))); } Collection<FileObjectVO> fileVOs = listFilesByOids(oids); FileObjectBO fileObjectBO = new FileObjectBO(); if(fileVOs.size()==1){ //åªæä¸ä¸ª FileObjectVO objectVO = fileVOs.stream().findFirst().get(); BeanUtil.convert(objectVO,fileObjectBO); OssFile ossFile = ossTemplate.statFile(objectVO.getBucketName(), objectVO.getObjectName()); if(ossFile == null || !StringUtils.hasLength(ossFile.getLink())){ throw new VciBaseException("æä»¶å¨åå¨éæ²¡ææ¾å°",oids.toArray(new String[0])); } URL url = null; try { url = new URL(ossFile.getLink()); } catch (MalformedURLException e) { throw new VciBaseException("æä»¶çè·åè·¯å¾æé®é¢",new String[]{ossFile.getLink()},e); } try { fileObjectBO.setInputStream(url.openStream()); }catch (Throwable e){ throw new VciBaseException("è·åæä»¶çæµæé®é¢",new String[]{ossFile.getLink()},e); } }else{ //æå¤ä¸ªï¼éè¦ä½¿ç¨zipè¿è¡å缩 String tempFolder = FileUtil.getDefaultTempFolder(); fileVOs.stream().forEach(fileVO->{ String fileName = tempFolder + File.separator + fileVO.getName() + "." + fileVO.getFileExtension(); File file = new File(fileName); try { if(!file.exists()) { file.createNewFile(); } }catch (Throwable e){ throw new VciBaseException("å建æä»¶åºé,{0}",new String[]{fileName}); } OssFile ossFile = ossTemplate.statFile(fileVO.getBucketName(), fileVO.getObjectName()); if(ossFile == null || !StringUtils.hasLength(ossFile.getLink())){ throw new VciBaseException("æä»¶å¨åå¨éæ²¡ææ¾å°",oids.toArray(new String[0])); } URL url = null; try { url = new URL(ossFile.getLink()); } catch (MalformedURLException e) { throw new VciBaseException("æä»¶çè·åè·¯å¾æé®é¢",new String[]{ossFile.getLink()},e); } try(OutputStream os = new FileOutputStream(file); InputStream ins = url.openStream(); ){ IOUtils.copy(ins,os); }catch (Throwable e){ throw new VciBaseException("ä¸è½½æä»¶å°ä¸´æ¶æä»¶å¤¹éåºé,{0}",new String[]{fileName}); } }); String zipName = new File(tempFolder).getPath() + File.separator + fileVOs.stream().findFirst().get().getName() + "ç"+fileVOs.size() + "个æä»¶.zip"; zipUtil.folderToZipFile(tempFolder,zipName); fileObjectBO.setFileLocalPath(zipName); if(log.isDebugEnabled()){ log.debug("ä¸è½½æä»¶çä¿¡æ¯,",zipName); } } return fileObjectBO; } /** * å 餿件 * * @param oids 主é®éå * @return æ§è¡ç»æ */ @Override @Transactional() public void deleteFiles(Collection<String> oids) { VciBaseUtil.alertNotNull(oids,"æä»¶ç主é®éå"); if(log.isDebugEnabled()){ log.debug("å 餿件,",oids.stream().collect(Collectors.joining(","))); } Collection<FileObject> fileObjects = listByIds(oids); if(!CollectionUtils.isEmpty(fileObjects)){ VciBaseUtil.switchCollectionForOracleIn(fileObjects).stream().forEach(fileDOs->{ fileObjectMapper.deleteBatchIds(fileDOs.stream().map(FileObject::getId).collect(Collectors.toList())); }); //å é¤minioéçæä»¶ fileObjects.parallelStream().forEach(fileObject -> { ossTemplate.removeFile(fileObject.getBucketName(),fileObject.getObjectName()); }); } } /** * ä¸ä¼ æä»¶ * * @param file æä»¶çä¿¡æ¯ * @param fileObjectDTO æä»¶çç¸å ³ä¿¡æ¯ * @return æä»¶ä¸ä¼ åçä¿¡æ¯ */ @Override @Transactional public R<FileObjectVO> uploadFile(MultipartFile file, FileObjectDTO fileObjectDTO) { VciBaseUtil.alertNotNull(fileObjectDTO,"æä»¶çä¿¡æ¯"); String sourceFileName = file.getOriginalFilename(); String fileExtension = FileUtil.getFileExtensionByName(sourceFileName); String fileNameNoExtension = FileUtil.getFileNameUnHasExtensionByName(sourceFileName); if(fileObjectDTO.getUpdateFileFlag()==null || !fileObjectDTO.getUpdateFileFlag()) { return R.data(add(fileObjectDTO,file)); }else{ //ä¿®æ¹ï¼éè¦å è·å VciBaseUtil.alertNotNull(fileObjectDTO.getOid(),"æä»¶ç主é®"); FileObject fileObject = getById(fileObjectDTO.getOid()); if (StringUtils.hasLength(fileObjectDTO.getId())) { fileObject.setId(fileNameNoExtension); } fileObject.setName(fileNameNoExtension); fileObject.setFileExtension(fileExtension); fileObject.setFileSize(file.getSize()); //以åçä¿¡æ¯å è·å String oldObjectName = fileObject.getObjectName(); String oldBucketName = fileObject.getBucketName(); String bucketName = StringUtils.hasLength(fileObjectDTO.getBucketName())?fileObjectDTO.getBucketName():ossProperties.getBucketName(); BladeFile bladeFile = ossTemplate.putFile(bucketName,file.getOriginalFilename(),file); fileObject.setBucketName(bucketName); fileObject.setObjectName(bladeFile.getName()); fileObject.setFileLink(bladeFile.getLink()); fileObjectMapper.updateById(fileObject); //å é¤ä»¥åç ossTemplate.removeFile(oldBucketName,oldObjectName); if(log.isDebugEnabled()){ log.debug("ä¿®æ¹æä»¶",fileObject.toString(),oldObjectName,oldBucketName); } FileObjectVO fileObjectVO = do2Vo(fileObject); return R.data(fileObjectVO); } } private FileObjectVO add(FileObjectDTO fileObjectDTO,MultipartFile file){ String sourceFileName = file.getOriginalFilename(); String fileExtension = FileUtil.getFileExtensionByName(sourceFileName); String fileNameNoExtension = FileUtil.getFileNameUnHasExtensionByName(sourceFileName); //åå¨ä¸å¡æ°æ®ä¸æä»¶ä¿¡æ¯ FileObject fileObject = new FileObject(); BeanUtil.convert(fileObjectDTO, fileObject); if (!StringUtils.hasLength(fileObject.getId())) { fileObject.setId(fileNameNoExtension); } if (!StringUtils.hasLength(fileObject.getName())) { fileObject.setName(fileNameNoExtension); } fileObject.setFileExtension(fileExtension); fileObject.setFileSize(file.getSize()); if (!StringUtils.hasLength(fileObject.getOid())) { fileObject.setOid(VciBaseUtil.getPk()); } if (fileObjectDTO.getEffect() != null && fileObjectDTO.getEffect()) { fileObject.setLcStatus(FileLife.FILE_RELEASE.getValue()); } else { fileObject.setLcStatus(FileLife.TRANS_FINISH.getValue()); } if (fileObject.getSecretGrade() == null || fileObject.getSecretGrade() == 0) { // VciBaseUtil.getCurrentUserSecret()è¿éè¦å¤çï¼å¨è¿å ¥æå¡çæ¶åï¼æ ¹æ®å½åç¨æ·çä¿¡æ¯è·åç¨æ·ç对象 fileObject.setSecretGrade( VciBaseUtil.getCurrentUserSecret()); } String bucketName = StringUtils.hasLength(fileObjectDTO.getBucketName())?fileObjectDTO.getBucketName():ossProperties.getBucketName(); //å åå°Minioåå说 BladeFile bladeFile = ossTemplate.putFile(bucketName,file.getOriginalFilename(),file); fileObject.setBucketName(bucketName); fileObject.setObjectName(bladeFile.getName()); fileObject.setFileLink(bladeFile.getLink()); fileObjectMapper.insert(fileObject); if(log.isDebugEnabled()){ log.debug("æ°å¢æä»¶",fileObject.toString()); } FileObjectVO fileObjectVO = do2Vo(fileObject); return fileObjectVO; } /** * æ°æ®å¯¹è±¡è½¬æ¾ç¤ºå¯¹è±¡ * @param fileObject æä»¶çæ°æ®å¯¹è±¡ * @return æ¾ç¤ºå¯¹è±¡ */ @Override public FileObjectVO do2Vo(FileObject fileObject) { FileObjectVO fileObjectVO = new FileObjectVO(); BeanUtil.convert(fileObject,fileObjectVO); fileObjectVO.setLcStatusText(BaseEnum.getTextByValue(FileLife.class,fileObjectVO.getLcStatus())); //fileObjectVO.setSecretGradeText(UserSecretEnum); return fileObjectVO; } @Override public List<FileObjectVO> do2Vos(Collection<FileObject> fileObjects){ List<FileObjectVO> fileObjectVOList = new ArrayList<>(); Optional.ofNullable(fileObjects).orElseGet(ArrayList::new).stream().forEach(fo->{ fileObjectVOList.add(do2Vo(fo)); }); return fileObjectVOList; } /** * å享æä»¶å°å ¶ä»æ°æ®ä¸ * * @param shareDTO æ¥æºä¸å¡ * @return å享åçæä»¶ä¿¡æ¯ */ @Override @Transactional public R<List<FileObjectVO>> shareFiles(FileShareDTO shareDTO) { VciBaseUtil.alertNotNull(shareDTO,"å享çä¿¡æ¯",shareDTO.getTargetBus(),"ç®æ çä¸å¡åç§°",shareDTO.getTargetBusOid(),"ç®æ çä¸å¡æ°æ®ä¸»é®"); List<FileObject> fileObjectList = new ArrayList<>(); if(!CollectionUtils.isEmpty(shareDTO.getOids())){ fileObjectList.addAll(listByIds(shareDTO.getOids())); } LambdaQueryWrapper<FileObject> queryWrapper = new LambdaQueryWrapper<FileObject>(FileObject.class); if(StringUtils.hasLength(shareDTO.getSourceBus())) { queryWrapper.in(FileObject::getOwnBtmName, VciBaseUtil.str2List(shareDTO.getSourceBus())); } if(StringUtils.hasLength(shareDTO.getSourceBusOid())){ queryWrapper.in(FileObject::getOwnbizOid,VciBaseUtil.str2List(shareDTO.getSourceBusOid())); } fileObjectList.addAll(fileObjectMapper.selectList(queryWrapper)); if(CollectionUtils.isEmpty(fileObjectList)){ throw new VciBaseException("æ²¡ææ¾å°å¯ä»¥å享çæä»¶"); } BladeUser user = AuthUtil.getUser(); Date now = new Date(); List<FileObject> newFileObjects = new ArrayList<>(); fileObjectList.stream().forEach(fileObject -> { FileObject newFileObject = new FileObject(); BeanUtil.convert(fileObject,newFileObject); newFileObject.setId(VciBaseUtil.getPk()); newFileObject.setNameOid(VciBaseUtil.getPk()); newFileObject.setRevisionOid(VciBaseUtil.getPk()); newFileObject.setCreator(user.getAccount()); newFileObject.setCreateTime(now); newFileObject.setLastModifier(user.getAccount()); newFileObject.setLastModifyTime(now); newFileObject.setTs(now); newFileObject.setOwnBtmName(shareDTO.getTargetBus()); newFileObject.setOwnbizOid(shareDTO.getTargetBusOid()); newFileObject.setObjectName(ossRule.fileName( "." + fileObject.getFileExtension())); //ä¸è½½æä»¶åï¼ä¸ä¼ æä»¶ ossTemplate.copyFile(fileObject.getBucketName(),fileObject.getObjectName(),fileObject.getBucketName(),newFileObject.getObjectName()); newFileObject.setFileLink(ossTemplate.fileLink(newFileObject.getBucketName(),newFileObject.getObjectName())); newFileObjects.add(newFileObject); }); newFileObjects.stream().forEach(fileObject -> { fileObjectMapper.insert(fileObject); }); return R.data(do2Vos(newFileObjects)); } /** * ä¿®æ¹æä»¶çä¿¡æ¯ï¼ä¸ä¼æ¹objectNameåfilePath) * * @param fileDTOs æä»¶çä¿¡æ¯ * @return ä¿®æ¹åçä¿¡æ¯ */ @Override @Transactional public R<List<FileObjectVO>> updateFileInfos(Collection<FileObjectDTO> fileDTOs) { VciBaseUtil.alertNotNull(fileDTOs,"è¦æ´æ°çæä»¶çä¿¡æ¯"); if(fileDTOs.stream().anyMatch(s->!StringUtils.hasLength(s.getId()))){ throw new VciBaseException("è¦æ´æ°çæä»¶ä¿¡æ¯ç主é®ä¸è½ä¸ºç©º"); } Map<String, FileObject> fileObjectMap = Optional.ofNullable(listByIds(fileDTOs.stream().map(FileObjectDTO::getId).collect(Collectors.toList()))).orElseGet(ArrayList::new).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t, (o1, o2) -> o1)); BladeUser user = AuthUtil.getUser(); Date now = new Date(); fileDTOs.stream().forEach(fileDTO->{ if(!fileObjectMap.containsKey(fileDTO.getOid())){ throw new VciBaseException("å称为{0}çæä»¶å¨ç³»ç»éä¸åå¨",new String[]{StringUtils.hasLength(fileDTO.getId())?fileDTO.getId():fileDTO.getName()}); } FileObject fileObject = fileObjectMap.get(fileDTO.getId()); String oldObjectName = fileObject.getObjectName(); String oldBucketName = fileObject.getBucketName(); String filePath = fileObject.getFileLink(); BeanUtil.convert(fileDTO,fileObject); fileObject.setObjectName(oldObjectName); fileObject.setBucketName(oldBucketName); fileObject.setFileLink(filePath); fileObject.setLastModifier(user.getAccount()); fileObject.setLastModifyTime(now); fileObject.setTs(now); }); fileObjectMap.values().stream().forEach(fileObject -> { fileObjectMapper.updateById(fileObject); }); return R.data(do2Vos(fileObjectMap.values())); } /** * æä»¶å表æ¥è¯¢ * * @param fileQuery æä»¶æ¥è¯¢ * @return æä»¶çæ¾ç¤ºä¿¡æ¯ */ @Override public IPage<FileObjectVO> listFiles(FileQuery fileQuery, Query query){ IPage<FileObject> pages = page(Condition.getPage(query), Condition.getQueryWrapper(fileQuery)); return pages.convert((fileObject -> do2Vo(fileObject))); } /** * ä½¿ç¨æä»¶ç䏻鮿¹éè·å对象 * * @param oids æä»¶ç主é®éå * @return æä»¶çæ¾ç¤ºä¿¡æ¯ */ @Override public List<FileObjectVO> listFilesByOids(Collection<String> oids) { return do2Vos(listByIds(oids)); } /** * æä»¶çæ * * @param oids 主é®éå * @return æ§è¡ç»æ */ @Override @Transactional public R releasedFiles(Collection<String> oids) { Collection<FileObject> fileObjects = listByIds(oids); if(!CollectionUtils.isEmpty(fileObjects)){ fileObjects.stream().forEach(obj->{ obj.setLcStatus(FileLife.FILE_RELEASE.getValue()); fileObjectMapper.updateById(obj); }); } return R.success("çææå"); } /** * æ¹éæå®æä»¶ä¸å¡æ°æ®åçæ * * @param releaseDTOS çæçç¸å ³ä¿¡æ¯ * @return æ§è¡ç»æ */ @Override @Transactional public R releasedFilesForOwn(Collection<FileReleaseDTO> releaseDTOS) { VciBaseUtil.alertNotNull(releaseDTOS,"åå¸çä¿¡æ¯"); List<FileObject> fileObjectList = new ArrayList<>(); List<String> oids = new ArrayList<>(); releaseDTOS.stream().filter(s->!CollectionUtils.isEmpty(s.getOids())).forEach(dtos->{ oids.addAll(dtos.getOids()); }); if(!CollectionUtils.isEmpty(oids)){ fileObjectList.addAll(listByIds(oids)); } releaseDTOS.stream().forEach(dto->{ LambdaQueryWrapper<FileObject> queryWrapper = new LambdaQueryWrapper<>(FileObject.class); if(StringUtils.hasLength(dto.getOwnBtmName())) { queryWrapper.in(FileObject::getOwnBtmName, VciBaseUtil.str2List(dto.getOwnBtmName())); } if(StringUtils.hasLength(dto.getOwnbizOid())) { queryWrapper.in(FileObject::getOwnbizOid, VciBaseUtil.str2List(dto.getOwnbizOid())); } fileObjectList.addAll(fileObjectMapper.selectList(queryWrapper)); }); if(!CollectionUtils.isEmpty(fileObjectList)){ fileObjectList.stream().forEach(objs->{ objs.setLcStatus(FileLife.FILE_RELEASE.getValue()); fileObjectMapper.updateById(objs); }); } return R.success("çææå"); } /** * å¨ä¸ä¼ æä»¶åï¼ä¿åæä»¶çä¿¡æ¯ * * @param fileObjectDTO æä»¶ä¿¡æ¯ä¼ è¾å¯¹è±¡ * @return æä»¶ä¿¡æ¯æ¾ç¤ºå¯¹è±¡ */ @Override @Transactional public R<FileObjectVO> saveFileAfterUpload(FileObjectDTO fileObjectDTO) { if(fileObjectDTO.getEffect() !=null && fileObjectDTO.getEffect() && !StringUtils.hasLength(fileObjectDTO.getLcStatus())){ fileObjectDTO.setLcStatus(FileLife.FILE_RELEASE.getValue()); } return R.data(addOnlyInfo(fileObjectDTO)); } /** * è·å对象 * * @param oid ä¸»é® * @return æä»¶çæ¾ç¤ºå¯¹è±¡ */ @Override public FileObjectVO get(String oid) { return do2Vo(getById(oid)); } /** * ä» æ·»å ä¿¡æ¯ * @param fileObjectDTO æä»¶çæ°æ®ä¼ è¾å¯¹è±¡ * @return æ¾ç¤ºå¯¹è±¡ */ public FileObjectVO addOnlyInfo(FileObjectDTO fileObjectDTO){ //åå¨ä¸å¡æ°æ®ä¸æä»¶ä¿¡æ¯ FileObject fileObject = new FileObject(); BeanUtil.convert(fileObjectDTO, fileObject); if (!StringUtils.hasLength(fileObject.getOid())) { fileObject.setOid(VciBaseUtil.getPk()); } if (fileObject.getSecretGrade() == null || fileObject.getSecretGrade() == 0) { // VciBaseUtil.getCurrentUserSecret()è¿éè¦å¤çï¼å¨è¿å ¥æå¡çæ¶åï¼æ ¹æ®å½åç¨æ·çä¿¡æ¯è·åç¨æ·ç对象 fileObject.setSecretGrade( VciBaseUtil.getCurrentUserSecret()); } fileObjectMapper.insert(fileObject); if(log.isDebugEnabled()){ log.debug("æ°å¢æä»¶",fileObject.toString()); } return do2Vo(fileObject); } } Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BaseEnum.java
@@ -1,7 +1,55 @@ package com.vci.ubcs.starter.web.enumpck; import com.alibaba.druid.util.StringUtils; public interface BaseEnum { String getValue(); String getText(); /** * ä½¿ç¨æä¸¾çå¼è·åæä¸¾å¯¹è±¡çéç¨æ¹æ³ * @param clazz æä¸¾æå±ç±» * @param value æä¸¾çå¼ * @param <T> ç±»å * @return ç»æ */ public static <T extends BaseEnum> T getEnumByValue(Class<T> clazz,Object value){ if(value == null){ return null; } T[] enums = clazz.getEnumConstants(); if (enums == null || enums.length == 0) { return null; } for (T e : enums) { if (value instanceof String) { if (StringUtils.equalsIgnoreCase((String) value, (String) ((BaseEnum) e).getValue())) { return e; } } else { if (value.equals(e.getValue())) { return e; } } } return null; } /** * ä½¿ç¨æä¸¾çå¼è·åæ¾ç¤ºææ¬çæ¹æ³ * @param clazz æä¸¾æå±çç±» * @param value æä¸¾çå¼ * @param <T> ç±»å * @return ç»æ */ public static <T extends BaseEnum> String getTextByValue(Class<T> clazz,String value){ T e = getEnumByValue(clazz, value); if (e == null) { return ""; } return ((BaseEnum) e).getText(); } }