From b5336d957680a1deb65d0565eed9c9eca630a738 Mon Sep 17 00:00:00 2001 From: weidy <lastanimals@163.com> Date: 星期二, 13 六月 2023 20:43:36 +0800 Subject: [PATCH] 文件服务的初步代码 --- Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BaseEnum.java | 48 + Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/IFileService.java | 111 +++ Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/life/FileLife.java | 84 ++ Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/AttachController.java | 2 Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileUtil.java | 388 +++++++++++ Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/FileObject.java | 90 ++ Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/impl/FileServiceImpl.java | 536 +++++++++++++++ Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/endpoint/OssEndpoint.java | 74 + Source/UBCS/ubcs-ops-api/ubcs-resource-api/pom.xml | 6 Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileObjectDTO.java | 54 + Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/vo/FileObjectVO.java | 21 Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileReleaseDTO.java | 33 Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/bo/FileObjectBO.java | 29 Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/ZipUtil.java | 155 ++++ Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java | 170 +++++ Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/mapper/FileObjectMapper.java | 12 Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/query/FileQuery.java | 34 + Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileShareDTO.java | 39 + Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileLifeConstant.java | 14 Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileBusConstant.java | 20 Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java | 80 ++ 21 files changed, 1,969 insertions(+), 31 deletions(-) diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/pom.xml b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/pom.xml index 853a302..68d64a2 100644 --- a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/pom.xml +++ b/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> diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/bo/FileObjectBO.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/bo/FileObjectBO.java new file mode 100644 index 0000000..7162528 --- /dev/null +++ b/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; +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileBusConstant.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileBusConstant.java new file mode 100644 index 0000000..7de3052 --- /dev/null +++ b/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"; + +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileLifeConstant.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileLifeConstant.java new file mode 100644 index 0000000..40e2449 --- /dev/null +++ b/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"; +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileObjectDTO.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileObjectDTO.java new file mode 100644 index 0000000..5fc3882 --- /dev/null +++ b/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; + + + +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileReleaseDTO.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileReleaseDTO.java new file mode 100644 index 0000000..e083b09 --- /dev/null +++ b/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; +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileShareDTO.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileShareDTO.java new file mode 100644 index 0000000..a67150b --- /dev/null +++ b/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; + +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/FileObject.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/FileObject.java new file mode 100644 index 0000000..ac4a352 --- /dev/null +++ b/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; + + /** + * 鍦╩inio閲岀殑鍚嶇О + */ + 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; + + +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/life/FileLife.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/life/FileLife.java new file mode 100644 index 0000000..b60a56e --- /dev/null +++ b/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; + } + + +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/query/FileQuery.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/query/FileQuery.java new file mode 100644 index 0000000..ff156d5 --- /dev/null +++ b/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; + + +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java new file mode 100644 index 0000000..6b3bed8 --- /dev/null +++ b/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; + } + } + } +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileUtil.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileUtil.java new file mode 100644 index 0000000..b57bb49 --- /dev/null +++ b/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 ""; + } + + /** + * 鑾峰彇涓婁紶鏂囦欢鐨勫悕绉帮紝鍦↖E娴忚鍣ㄤ笂锛屼笂浼犱細鎶婂叏璺緞甯﹁繃鏉� + * @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); + } + } + + /** + * 璇诲彇鏂囦欢鐨勫唴瀹癸紝鏂囦欢涓嶈兘鏄痡ar閲岀殑 + * @param fileName 鏂囦欢鐨勫悕绉� + * @return 鏂囦欢鐨勫唴瀹癸紝鏄疷TF-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); + } + } + + /** + * 浠庨」鐩噷鎴栬�卝ar鐨勬枃浠跺埌鐩爣鏂囦欢 + * @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; + } +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/ZipUtil.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/ZipUtil.java new file mode 100644 index 0000000..9471a74 --- /dev/null +++ b/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 榛樿涓篏BK锛屽惁鍒欓渶瑕侀厤缃� + */ + 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鐨勫瓧绗﹂泦锛寃indows搴旇涓篏BK + * @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()));) { + //榛樿鏄疷TF-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); + } + + + /** + * 灏嗗涓釜鏂囦欢娣诲姞鍒皕ip涓� + * @param files 鏂囦欢 + * @param zipFile zip鏂囦欢 + * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮坊鍔犲嚭閿欑殑浼氭姏鍑哄紓甯� + */ + public void addFileToZip(File[] files, String zipFile) throws VciBaseException{ + addFileToZip(files, zipFile,getZipCharset()); + } + + /** + * 灏嗗涓釜鏂囦欢娣诲姞鍒皕ip涓� + * @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); + } + } +} diff --git a/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/vo/FileObjectVO.java b/Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/vo/FileObjectVO.java new file mode 100644 index 0000000..40aa570 --- /dev/null +++ b/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; + + +} diff --git a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/AttachController.java b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/AttachController.java index 3a04595..e1deaaa 100644 --- a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/AttachController.java +++ b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/AttachController.java @@ -38,6 +38,8 @@ /** * 闄勪欢琛� 鎺у埗鍣� * + * + * * @author Chill */ @NonDS diff --git a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java new file mode 100644 index 0000000..1227cc4 --- /dev/null +++ b/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鍜宖ilePath涓嶄細鍙樺寲 + * @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); + } + +} diff --git a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/endpoint/OssEndpoint.java b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/endpoint/OssEndpoint.java index 9252704..dacf234 100644 --- a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/endpoint/OssEndpoint.java +++ b/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; + /** * 瀵硅薄瀛樺偍绔偣 + * + * 杩欎釜绫讳笉浣跨敤锛岀粺涓�鐢╢ileController * * @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); +// } /** * 鏋勫缓闄勪欢琛� diff --git a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/mapper/FileObjectMapper.java b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/mapper/FileObjectMapper.java new file mode 100644 index 0000000..bbffaf0 --- /dev/null +++ b/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> { +} diff --git a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/IFileService.java b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/IFileService.java new file mode 100644 index 0000000..ab641e6 --- /dev/null +++ b/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); + + /** + * 淇敼鏂囦欢鐨勪俊鎭紙涓嶄細鏀筼bjectName鍜宖ilePath) + * @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); +} diff --git a/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/impl/FileServiceImpl.java b/Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..bdec3fd --- /dev/null +++ b/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{ + //鏈夊涓紝闇�瑕佷娇鐢▃ip杩涜鍘嬬缉 + 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(); + //鍏堝瓨鍒癕inio鍚庡啀璇� + 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)); + } + + /** + * 淇敼鏂囦欢鐨勪俊鎭紙涓嶄細鏀筼bjectName鍜宖ilePath) + * + * @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); + } + +} diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BaseEnum.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BaseEnum.java index ebdc3f2..a9422a1 100644 --- a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BaseEnum.java +++ b/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(); + } } -- Gitblit v1.9.3