|
@@ -3,23 +3,29 @@ package com.fjhx.file.service.impl;
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.io.FileUtil;
|
|
|
-import cn.hutool.core.io.IoUtil;
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.aliyun.oss.OSS;
|
|
|
+import com.aliyun.oss.OSSClientBuilder;
|
|
|
+import com.aliyun.oss.common.utils.BinaryUtil;
|
|
|
+import com.aliyun.oss.model.MatchMode;
|
|
|
+import com.aliyun.oss.model.PolicyConditions;
|
|
|
+import com.aliyun.oss.model.PutObjectRequest;
|
|
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
-import com.fjhx.file.entity.*;
|
|
|
+import com.fjhx.file.entity.FileInfo;
|
|
|
+import com.fjhx.file.entity.FileInfoSelectDto;
|
|
|
+import com.fjhx.file.entity.FileInfoVo;
|
|
|
+import com.fjhx.file.entity.ObsFile;
|
|
|
+import com.fjhx.file.entity.SingDto;
|
|
|
+import com.fjhx.file.entity.SingVo;
|
|
|
+import com.fjhx.file.entity.UploadBodyDto;
|
|
|
import com.fjhx.file.mapper.FileInfoMapper;
|
|
|
import com.fjhx.file.service.FileInfoService;
|
|
|
-import com.fjhx.file.utils.TencentCosUtils;
|
|
|
-import com.obs.services.ObsClient;
|
|
|
-import com.obs.services.model.PostSignatureRequest;
|
|
|
-import com.obs.services.model.PostSignatureResponse;
|
|
|
-import com.obs.services.model.PutObjectRequest;
|
|
|
import com.ruoyi.common.constant.BaseSourceConstant;
|
|
|
import com.ruoyi.common.core.domain.BaseIdPo;
|
|
|
import com.ruoyi.common.exception.ServiceException;
|
|
@@ -30,7 +36,14 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
-import java.util.*;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.LinkedHashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.StringJoiner;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -53,18 +66,6 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
|
|
|
@Value("${obs.endPoint}")
|
|
|
private String endPoint;
|
|
|
|
|
|
- @Value("${obs.url}")
|
|
|
- private String url;
|
|
|
-
|
|
|
- @Value("${obs.type:}")
|
|
|
- private String type;
|
|
|
-
|
|
|
- @Value("${obs.region:}")
|
|
|
- private String region;
|
|
|
-
|
|
|
- @Value("${obs.uploadMethod:}")
|
|
|
- private String uploadMethod;
|
|
|
-
|
|
|
@Value("${obs.bucketName}")
|
|
|
private String bucketName;
|
|
|
|
|
@@ -95,52 +96,35 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
|
|
|
.add(IdUtil.fastSimpleUUID() + (ObjectUtil.isEmpty(suffix) ? "" : "." + suffix))
|
|
|
.toString();
|
|
|
|
|
|
- //后端上传方式
|
|
|
- if (Objects.equals(uploadMethod, "back")) {
|
|
|
- // 封装签名
|
|
|
- Map<String, String> body = new LinkedHashMap<>();
|
|
|
- body.put("key", objectKey);
|
|
|
- singVo.setUploadBody(body);
|
|
|
-
|
|
|
- // 保存文件
|
|
|
- FileInfo fileInfo = new FileInfo();
|
|
|
- fileInfo.setFileUrl(objectKey);
|
|
|
- fileInfo.setFileName(dto.getFileName());
|
|
|
- save(fileInfo);
|
|
|
-
|
|
|
- // 封装文件信息
|
|
|
- singVo.setUploadUrl("/open/fileInfo/upload");
|
|
|
- singVo.setId(fileInfo.getId());
|
|
|
- singVo.setFileName(dto.getFileName());
|
|
|
- singVo.setFileUrl(url + objectKey);
|
|
|
-
|
|
|
- return singVo;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //原华为云前端直传(默认)
|
|
|
- ObsClient obsClient = null;
|
|
|
-
|
|
|
+ // 获取oss链接实例
|
|
|
+ OSS ossClient = getOssClient();
|
|
|
try {
|
|
|
- // 获取oss链接客户端
|
|
|
- obsClient = getObsClient();
|
|
|
- // 指定签名有效期为10秒
|
|
|
- long currentTimeMillis = System.currentTimeMillis() + 1000 * 10;
|
|
|
- // 获取签名
|
|
|
- PostSignatureRequest request = new PostSignatureRequest(currentTimeMillis, bucketName, objectKey);
|
|
|
- PostSignatureResponse temporarySignature = obsClient.createPostSignature(request);
|
|
|
+ long expireTime = 60;
|
|
|
+ long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
|
|
|
+ Date expiration = new Date(expireEndTime);
|
|
|
+ PolicyConditions policyConditions = new PolicyConditions();
|
|
|
+ // PostObject请求最大可支持的文件大小为5 GB,在此设置最大上次文件大小为1000M
|
|
|
+ policyConditions.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
|
|
|
+ // MatchMode.Exact:精确匹配 MatchMode.StartWith:前缀匹配
|
|
|
+ policyConditions.addConditionItem(MatchMode.Exact, PolicyConditions.COND_KEY, objectKey);
|
|
|
+
|
|
|
+ String postPolicy = ossClient.generatePostPolicy(expiration, policyConditions);
|
|
|
+ byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
|
|
|
+ String encodedPolicy = BinaryUtil.toBase64String(binaryData);
|
|
|
+ String postSignature = ossClient.calculatePostSignature(postPolicy);
|
|
|
+
|
|
|
// 封装签名
|
|
|
Map<String, String> body = new LinkedHashMap<>();
|
|
|
- body.put("policy", temporarySignature.getPolicy());
|
|
|
- body.put("AccessKeyId", ak);
|
|
|
- body.put("signature", temporarySignature.getSignature());
|
|
|
+ body.put("policy", encodedPolicy);
|
|
|
+ body.put("ossAccessKeyId", ak);
|
|
|
+ body.put("signature", postSignature);
|
|
|
body.put("key", objectKey);
|
|
|
singVo.setUploadBody(body);
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
throw new ServiceException("获取签名失败");
|
|
|
} finally {
|
|
|
- IoUtil.close(obsClient);
|
|
|
+ ossClient.shutdown();
|
|
|
}
|
|
|
|
|
|
// 保存文件
|
|
@@ -150,10 +134,10 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
|
|
|
save(fileInfo);
|
|
|
|
|
|
// 封装文件信息
|
|
|
- singVo.setUploadUrl("https://" + bucketName + "." + endPoint);
|
|
|
+ singVo.setUploadUrl(getUrl());
|
|
|
singVo.setId(fileInfo.getId());
|
|
|
singVo.setFileName(dto.getFileName());
|
|
|
- singVo.setFileUrl(url + objectKey);
|
|
|
+ singVo.setFileUrl(singVo.getUploadUrl() + objectKey);
|
|
|
|
|
|
return singVo;
|
|
|
}
|
|
@@ -163,26 +147,15 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
|
|
|
MultipartFile file = uploadBody.getFile();
|
|
|
String objectKey = uploadBody.getKey();
|
|
|
|
|
|
-
|
|
|
- //腾讯云COS对象存储
|
|
|
- if (Objects.equals(type, "tencent")) {
|
|
|
- TencentCosUtils.uploadFile(ak, sk, bucketName,region, objectKey, file);
|
|
|
- }
|
|
|
- //华为云OBS对象存储(默认)
|
|
|
- else if (Objects.equals(type, "huawei")) {
|
|
|
- ObsClient obsClient = getObsClient();
|
|
|
- try {
|
|
|
- PutObjectRequest putObjectRequest = new PutObjectRequest();
|
|
|
- putObjectRequest.setBucketName(bucketName);
|
|
|
- putObjectRequest.setObjectKey(objectKey);
|
|
|
- putObjectRequest.setInput(file.getInputStream());
|
|
|
- obsClient.putObject(putObjectRequest);
|
|
|
- } catch (IOException e) {
|
|
|
- log.error(e.getMessage(), e);
|
|
|
- throw new ServiceException("华为云 文件上传失败!");
|
|
|
- } finally {
|
|
|
- IoUtil.close(obsClient);
|
|
|
- }
|
|
|
+ OSS ossClient = getOssClient();
|
|
|
+ try {
|
|
|
+ PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, file.getInputStream());
|
|
|
+ ossClient.putObject(putObjectRequest);
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ throw new ServiceException("oss文件上传失败!");
|
|
|
+ } finally {
|
|
|
+ ossClient.shutdown();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -199,12 +172,12 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
|
|
|
wrapper.eq("fi", FileInfo::getBusinessType, dto.getFileType());
|
|
|
List<FileInfoVo> list = this.baseMapper.getList(wrapper);
|
|
|
|
|
|
- if (list.size() == 0) {
|
|
|
+ if (list.isEmpty()) {
|
|
|
return new HashMap<>();
|
|
|
}
|
|
|
|
|
|
return list.stream()
|
|
|
- .peek(fileInfoVo -> fileInfoVo.setFileUrl(url + fileInfoVo.getFileUrl()))
|
|
|
+ .peek(fileInfoVo -> fileInfoVo.setFileUrl(getUrl() + fileInfoVo.getFileUrl()))
|
|
|
.collect(Collectors.groupingBy(FileInfoVo::getBusinessId));
|
|
|
}
|
|
|
|
|
@@ -217,7 +190,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
|
|
|
@Override
|
|
|
public void saveFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
|
|
|
// 切换到从库
|
|
|
- if (obsFileList == null || obsFileList.size() == 0) {
|
|
|
+ if (obsFileList == null || obsFileList.isEmpty()) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -240,7 +213,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
|
|
|
@DS(BaseSourceConstant.BASE)
|
|
|
@Override
|
|
|
public void saveAllFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
|
|
|
- if (obsFileList == null || obsFileList.size() == 0) {
|
|
|
+ if (obsFileList == null || obsFileList.isEmpty()) {
|
|
|
return;
|
|
|
}
|
|
|
List<FileInfo> fileInfoList = BeanUtil.copyToList(obsFileList, FileInfo.class);
|
|
@@ -260,7 +233,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
|
|
|
@DS(BaseSourceConstant.BASE)
|
|
|
@Override
|
|
|
public void editFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
|
|
|
- if (obsFileList == null || obsFileList.size() == 0) {
|
|
|
+ if (obsFileList == null || obsFileList.isEmpty()) {
|
|
|
this.remove(q -> q.eq(FileInfo::getBusinessId, businessId).eq(FileInfo::getBusinessType, businessType));
|
|
|
return;
|
|
|
}
|
|
@@ -321,11 +294,12 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取oss链接客户端
|
|
|
- */
|
|
|
- private ObsClient getObsClient() {
|
|
|
- return new ObsClient(ak, sk, endPoint);
|
|
|
+ private OSS getOssClient() {
|
|
|
+ return new OSSClientBuilder().build(endPoint, ak, sk);
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getUrl() {
|
|
|
+ return "https://" + bucketName + "." + endPoint + "/";
|
|
|
}
|
|
|
|
|
|
/**
|