加上通过url上传文件-支持下载解析临时授权链接

This commit is contained in:
xudawei 2024-04-28 19:06:31 +08:00
parent cfc52e61fc
commit b3f26b9395

View File

@ -836,10 +836,14 @@ public class FileServiceImpl implements FileService {
return Lists.newArrayList();
}
//构建http入参的对象集合
List<SignUrlDownloadResponse> httpUrlResList = this.buildHttpUrlResponse(dto);
List<SignUrlDownloadResponse> httpUrlResList = this.buildHttpUrlNotSignResponse(dto);
List<SignUrlDownloadResponse> httpUrlSignResList = this.buildHttpUrlSignResponse(dto);
//构建fileKey入参对象集合
List<SignUrlDownloadResponse> fileKeyResList = this.buildFileKeyResponse(dto);
List<SignUrlDownloadResponse> fileKeyResList = this.buildFileKeyResponse(dto.getFileKeys(), dto.getBizScene());
httpUrlResList.addAll(fileKeyResList);
httpUrlResList.addAll(httpUrlSignResList);
log.info("signUrl download end result = {}, times:{}", JsonUtil.obj2Str(httpUrlResList), System.currentTimeMillis() - start);
return httpUrlResList;
}
@ -847,11 +851,11 @@ public class FileServiceImpl implements FileService {
/**
* 构建fileKey(非http的入参)的返回对象
*/
private List<SignUrlDownloadResponse> buildFileKeyResponse(SignUrlDownloadDto dto) {
if (CollectionUtil.isEmpty(dto.getFileKeys())) {
private List<SignUrlDownloadResponse> buildFileKeyResponse(List<String> fileKeys, String bizScene) {
if (CollectionUtil.isEmpty(fileKeys)) {
return Lists.newArrayList();
}
List<String> fileKeyList = dto.getFileKeys().stream().filter(item -> StringUtils.isNoneBlank(item) && !item.startsWith("http")).collect(Collectors.toList());
List<String> fileKeyList = fileKeys.stream().filter(item -> StringUtils.isNoneBlank(item) && !item.startsWith("http")).collect(Collectors.toList());
if (CollectionUtil.isEmpty(fileKeyList)) {
return Lists.newArrayList();
}
@ -865,7 +869,7 @@ public class FileServiceImpl implements FileService {
List<AppChannelBucket> appChannelBucketList = appChannelBucketManager.getByAppChannelBucketNos(fileList.stream().map(File::getAppChannelBucketNo).collect(Collectors.toSet()));
Map<String, String> bucketTypeMap = appChannelBucketList.stream().collect(Collectors.toMap(AppChannelBucket::getAppChannelBucketNo, AppChannelBucket::getBucketType, (x, y) -> y));
//构建场景集合
List<FileBusinessScene> fileBusinessSceneList = fileBusinessSceneManager.queryByBucketNoAndScene(fileList.stream().map(File::getAppChannelBucketNo).collect(Collectors.toSet()), dto.getBizScene());
List<FileBusinessScene> fileBusinessSceneList = fileBusinessSceneManager.queryByBucketNoAndScene(fileList.stream().map(File::getAppChannelBucketNo).collect(Collectors.toSet()), bizScene);
Map<String, Long> bizSceneExpireMap = fileBusinessSceneList.stream().collect(Collectors.toMap(FileBusinessScene::getAppChannelBucketNo, FileBusinessScene::getDownloadExpiration, (x, y) -> y));
//构建返回集合
return this.buildFileKeyRespByFile(fileList, bucketTypeMap, bizSceneExpireMap);
@ -904,11 +908,11 @@ public class FileServiceImpl implements FileService {
/**
* 构建http链接(非fileKey入参)返回对象
*/
private List<SignUrlDownloadResponse> buildHttpUrlResponse(SignUrlDownloadDto dto) {
private List<SignUrlDownloadResponse> buildHttpUrlNotSignResponse(SignUrlDownloadDto dto) {
if (CollectionUtil.isEmpty(dto.getFileKeys())) {
return Lists.newArrayList();
}
List<String> httpUrlList = dto.getFileKeys().stream().filter(item -> StringUtils.isNoneBlank(item) && item.startsWith("http")).collect(Collectors.toList());
List<String> httpUrlList = dto.getFileKeys().stream().filter(item -> StringUtils.isNoneBlank(item) && item.startsWith("http") && !isSignUrl(item)).collect(Collectors.toList());
if (CollectionUtil.isEmpty(httpUrlList)) {
return Lists.newArrayList();
}
@ -918,6 +922,73 @@ public class FileServiceImpl implements FileService {
.build()).collect(Collectors.toList());
}
/**
* 构建http链接(非fileKey入参)返回对象
*/
private List<SignUrlDownloadResponse> buildHttpUrlSignResponse(SignUrlDownloadDto dto) {
if (CollectionUtil.isEmpty(dto.getFileKeys())) {
return Lists.newArrayList();
}
List<String> httpUrlList = dto.getFileKeys().stream().filter(item -> StringUtils.isNoneBlank(item) && item.startsWith("http") && isSignUrl(item)).collect(Collectors.toList());
if (CollectionUtil.isEmpty(httpUrlList)) {
return Lists.newArrayList();
}
Map<String, String> map = httpUrlList.stream().collect(Collectors.toMap(item -> item, value -> signUrlToFileKey(value)));
if (CollectionUtil.isEmpty(map)) {
return httpUrlList.stream().map(item -> SignUrlDownloadResponse.builder().fileKey(item).signUrl(item).build()).collect(Collectors.toList());
}
List<SignUrlDownloadResponse> responseList = this.buildFileKeyResponse(Lists.newArrayList(map.values()), null);
if (CollectionUtil.isEmpty(responseList)) {
return httpUrlList.stream().map(item -> SignUrlDownloadResponse.builder().fileKey(item).signUrl(item).build()).collect(Collectors.toList());
}
Map<String, String > respMap = responseList.stream().collect(Collectors.toMap(item -> item.getFileKey(), value -> value.getSignUrl(), (x,y) -> x));
return httpUrlList.stream().map(item -> {
SignUrlDownloadResponse response = new SignUrlDownloadResponse();
response.setFileKey(item);
String fileKey = map.get(item);
if (StringUtils.isNotBlank(fileKey)) {
String signUrl = respMap.get(fileKey);
if (StringUtils.isNotBlank(signUrl)) {
response.setSignUrl(signUrl);
} else {
response.setSignUrl(item);
}
} else {
response.setSignUrl(item);
}
return response;
}).collect(Collectors.toList());
}
private String signUrlToFileKey(String signUrl) {
if (StringUtils.isBlank(signUrl)) {
return StringUtils.EMPTY;
}
if (signUrl.contains("/") && signUrl.contains("?")) {
String fileName = signUrl.substring(signUrl.lastIndexOf("/") + 1, signUrl.indexOf("?"));
if (fileName.contains(".")) {
return fileName.substring(0, fileName.indexOf("."));
}
return fileName;
}
return signUrl;
}
/**
* 是否临时授权url
*/
private boolean isSignUrl(String url) {
if (StringUtils.isBlank(url)) {
return false;
}
if (url.toLowerCase().contains("expire")) {
return true;
}
return false;
}
/**
* 授权给第三方下载-上传
*/