上传或者下载时,加上文件名称参数开关
This commit is contained in:
parent
fabf67fb53
commit
5e05799c3e
@ -13,7 +13,7 @@ public interface AliOssService extends BaseS3Service {
|
||||
/**
|
||||
* 授权给第三方下载
|
||||
*/
|
||||
String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName);
|
||||
String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName, boolean hasFileName);
|
||||
|
||||
/**
|
||||
* 授权给第三方-上传
|
||||
|
||||
@ -24,7 +24,7 @@ public interface HuaWeiCloudService {
|
||||
/**
|
||||
* 授权给第三方-下载
|
||||
*/
|
||||
String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName, String style);
|
||||
String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName, String style, boolean hasFilename);
|
||||
|
||||
/**
|
||||
* 授权给第三方-上传
|
||||
|
||||
@ -288,7 +288,7 @@ public class AliOssServiceImpl implements AliOssService {
|
||||
* 授权给第三方-下载
|
||||
*/
|
||||
@Override
|
||||
public String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName) {
|
||||
public String downloadSignUrl(String bucketName, String key, Long expireSecond, String fileName, boolean hasFileName) {
|
||||
Date date = new Date();
|
||||
date.setTime(date.getTime() + expireSecond * 1000);
|
||||
try {
|
||||
@ -296,7 +296,9 @@ public class AliOssServiceImpl implements AliOssService {
|
||||
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.GET);
|
||||
request.setExpiration(date);
|
||||
ResponseHeaderOverrides responseHeaderOverrides = new ResponseHeaderOverrides();
|
||||
if (hasFileName) {
|
||||
responseHeaderOverrides.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
|
||||
}
|
||||
request.setResponseHeaders(responseHeaderOverrides);
|
||||
URL url = aliOssClient.getClient().generatePresignedUrl(request);
|
||||
log.info("aliyun downloadSignUrl result, bucketName:{}, key:{}, url:{}", bucketName, key, JsonUtil.obj2Str(url));
|
||||
|
||||
@ -17,6 +17,7 @@ import com.obs.services.model.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.InputStream;
|
||||
@ -333,17 +334,21 @@ public class HuaWeiCloudServiceImpl implements HuaWeiCloudService {
|
||||
* 授权给第三方-下载
|
||||
*/
|
||||
@Override
|
||||
public String downloadSignUrl(String bucketName, String key, Long expireSeconds, String fileName, String style) {
|
||||
public String downloadSignUrl(String bucketName, String key, Long expireSeconds, String fileName, String style, boolean hasFilename) {
|
||||
TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);
|
||||
request.setBucketName(bucketName);
|
||||
request.setObjectKey(key);
|
||||
Map<String, Object> queryParams = Maps.newHashMap();
|
||||
try {
|
||||
if (hasFilename) {
|
||||
queryParams.put("response-content-disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
|
||||
}
|
||||
if (StringUtils.hasText(style)) {
|
||||
queryParams.put("x-image-process", "image/auto-orient,1/resize,p_50/quality,q_30");
|
||||
}
|
||||
if (!CollectionUtils.isEmpty(queryParams)) {
|
||||
request.setQueryParams(queryParams);
|
||||
}
|
||||
log.info("huawei cloud downloadSignUrl params, bucketName:{}, key:{}, request:{}", bucketName, key, JsonUtil.obj2Str(request));
|
||||
TemporarySignatureResponse response = huaWeiCloudObsClient.getClient().createTemporarySignature(request);
|
||||
log.info("huawei cloud downloadSignUrl result, bucketName:{}, key:{}, request:{}", bucketName, key, JsonUtil.obj2Str(response));
|
||||
|
||||
@ -59,12 +59,12 @@ public interface FileManager {
|
||||
/**
|
||||
* 根据华为云/阿里云,授权给第三方下载
|
||||
*/
|
||||
String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName, String style);
|
||||
String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName, String style, boolean hasFileName);
|
||||
|
||||
/**
|
||||
* 根据华为云/阿里云,授权给第三方上传
|
||||
*/
|
||||
SignUrlUploadVo signUrlUpload(String bucketName, String key, String fileName, Long expireSecond, String channelCode, String contentType, String bucketType);
|
||||
SignUrlUploadVo signUrlUpload(String bucketName, String key, String fileName, Long expireSecond, String channelCode, String contentType, String bucketType, boolean hasFileName);
|
||||
|
||||
/**
|
||||
* 删除File
|
||||
|
||||
@ -38,5 +38,9 @@ public class SignUrlDownloadDto {
|
||||
* 图片样式,比如x-oss-process=image/auto-orient,1/resize,p_50/quality,q_30
|
||||
*/
|
||||
private String style;
|
||||
/**
|
||||
* 是否带上文件名称
|
||||
*/
|
||||
private Boolean hasFileName = true;
|
||||
|
||||
}
|
||||
|
||||
@ -57,4 +57,9 @@ public class SignUrlUploadDto {
|
||||
* 过期时间
|
||||
*/
|
||||
private Long expiration;
|
||||
|
||||
/**
|
||||
* 是否带上文件名称
|
||||
*/
|
||||
private Boolean hasFileName = true;
|
||||
}
|
||||
|
||||
@ -148,13 +148,13 @@ public class FileManagerImpl implements FileManager {
|
||||
* 根据华为云/阿里云,授权给第三方下载
|
||||
*/
|
||||
@Override
|
||||
public String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName, String style) {
|
||||
public String signUrlDownload(String bucketName, String key, Long expireSecond, String channelCode, String fileName, String style, boolean hasFileName) {
|
||||
ChannelTypeEnum typeEnum = ChannelTypeEnum.getChannelTypeByChannelCode(channelCode);
|
||||
switch (typeEnum) {
|
||||
case OBS:// 华为云
|
||||
return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName, style);
|
||||
return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName, style, hasFileName);
|
||||
case OSS:// 阿里云
|
||||
return aliOssService.downloadSignUrl(bucketName, key, expireSecond, fileName);
|
||||
return aliOssService.downloadSignUrl(bucketName, key, expireSecond, fileName, hasFileName);
|
||||
default:
|
||||
BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST);
|
||||
}
|
||||
@ -165,7 +165,7 @@ public class FileManagerImpl implements FileManager {
|
||||
* 根据华为云/阿里云,授权给第三方上传
|
||||
*/
|
||||
@Override
|
||||
public SignUrlUploadVo signUrlUpload(String bucketName, String key, String fileName, Long expireSecond, String channelCode, String contentType, String bucketType) {
|
||||
public SignUrlUploadVo signUrlUpload(String bucketName, String key, String fileName, Long expireSecond, String channelCode, String contentType, String bucketType, boolean hasFileName) {
|
||||
ChannelTypeEnum typeEnum = ChannelTypeEnum.getChannelTypeByChannelCode(channelCode);
|
||||
switch (typeEnum) {
|
||||
case OBS:// 华为云
|
||||
@ -176,13 +176,13 @@ public class FileManagerImpl implements FileManager {
|
||||
.host(response.getActualSignedRequestHeaders().get(HUAWEI_CLOUD_SIGNURL_UPLOAD_HOST_KEY))
|
||||
.contentType(response.getActualSignedRequestHeaders().get(HUAWEI_CLOUD_SIGNURL_UPLOAD_CONTENT_TYPE_KEY))
|
||||
.channelCode(channelCode)
|
||||
.downloadSignUrl(UrlUtil.httpToHttps(this.downloadHuaweiSignUrl(bucketName, key, expireSecond, bucketType, fileName)))
|
||||
.downloadSignUrl(UrlUtil.httpToHttps(this.downloadHuaweiSignUrl(bucketName, key, expireSecond, bucketType, fileName, hasFileName)))
|
||||
.build();
|
||||
case OSS:// 阿里云
|
||||
return SignUrlUploadVo.builder()
|
||||
.signUrl(UrlUtil.httpToHttps(aliOssService.uploadSignUrl(bucketName, key, fileName,expireSecond)))
|
||||
.channelCode(channelCode)
|
||||
.downloadSignUrl(UrlUtil.httpToHttps(this.downloadAliyunSignUrl(bucketName, key, expireSecond, bucketType, fileName)))
|
||||
.downloadSignUrl(UrlUtil.httpToHttps(this.downloadAliyunSignUrl(bucketName, key, expireSecond, bucketType, fileName, hasFileName)))
|
||||
.build();
|
||||
default:
|
||||
BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST);
|
||||
@ -193,10 +193,10 @@ public class FileManagerImpl implements FileManager {
|
||||
/**
|
||||
* 构建华为云下载地址
|
||||
*/
|
||||
private String downloadHuaweiSignUrl(String bucketName, String key, Long expireSecond, String bucketType, String fileName) {
|
||||
private String downloadHuaweiSignUrl(String bucketName, String key, Long expireSecond, String bucketType, String fileName, boolean hasFileName) {
|
||||
switch (BucketTypeEnum.getByCode(bucketType)) {
|
||||
case PRIVATE_BUCKET:
|
||||
return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName, null);
|
||||
return huaWeiCloudService.downloadSignUrl(bucketName, key, expireSecond, fileName, null, hasFileName);
|
||||
case PUBLIC_BUCKET:
|
||||
return huaWeiCloudService.getUrl(bucketName, key);
|
||||
default:
|
||||
@ -208,10 +208,10 @@ public class FileManagerImpl implements FileManager {
|
||||
/**
|
||||
* 构建阿里云下载地址
|
||||
*/
|
||||
private String downloadAliyunSignUrl(String bucketName, String key, Long expireSecond, String bucketType, String fileName) {
|
||||
private String downloadAliyunSignUrl(String bucketName, String key, Long expireSecond, String bucketType, String fileName, boolean hasFileName) {
|
||||
switch (BucketTypeEnum.getByCode(bucketType)) {
|
||||
case PRIVATE_BUCKET:
|
||||
return aliOssService.downloadSignUrl(bucketName, key, expireSecond, fileName);
|
||||
return aliOssService.downloadSignUrl(bucketName, key, expireSecond, fileName, hasFileName);
|
||||
case PUBLIC_BUCKET:
|
||||
return aliOssService.getUrl(bucketName, key);
|
||||
default:
|
||||
|
||||
@ -253,7 +253,7 @@ public class FileByUrlServiceImpl implements FileByUrlService {
|
||||
fileUrl = this.fileManager.fetchDownloadUrl(fileUploadConfig.getBucketName(), tgtFileKey, channelCode);
|
||||
break;
|
||||
case PRIVATE_BUCKET:
|
||||
fileUrl = this.fileManager.signUrlDownload(fileUploadConfig.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName, null);
|
||||
fileUrl = this.fileManager.signUrlDownload(fileUploadConfig.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , channelCode, fileName, null,false);
|
||||
break;
|
||||
default:
|
||||
BizException.error(CodeEnum.CHANNEL_TYPE_NOT_EXIST);
|
||||
|
||||
@ -501,7 +501,7 @@ public class FileServiceImpl implements FileService {
|
||||
response.setFileKey(fileKey);
|
||||
if (Objects.nonNull(bucketTypeMap.get(file.getAppChannelBucketNo())) && BucketTypeEnum.PRIVATE_BUCKET.getCode().equals(bucketTypeMap.get(file.getAppChannelBucketNo()))) {
|
||||
String tgtFileKey = Utility.generateFileKey(file.getDirectory(), file.getFileUuid(), file.getFileFormat());
|
||||
response.setUrl(fileManager.signUrlDownload(file.getBucketName(), tgtFileKey, SIGN_URL_DOWNLOAD_EXPIRE_SECOND, file.getChannelCode(), file.getFileName(), null));
|
||||
response.setUrl(fileManager.signUrlDownload(file.getBucketName(), tgtFileKey, SIGN_URL_DOWNLOAD_EXPIRE_SECOND, file.getChannelCode(), file.getFileName(), null, false));
|
||||
} else {
|
||||
response.setUrl(fileUrl);
|
||||
}
|
||||
@ -832,6 +832,8 @@ public class FileServiceImpl implements FileService {
|
||||
public List<SignUrlDownloadResponse> signUrlDownload(SignUrlDownloadDto dto) {
|
||||
log.info("signUrl download dto = {}", JsonUtil.obj2Str(dto));
|
||||
Long start = System.currentTimeMillis();
|
||||
//是否代文件名称
|
||||
dto.setHasFileName(Objects.isNull(dto.getHasFileName()) ? true : dto.getHasFileName());
|
||||
|
||||
if (CollectionUtil.isEmpty(dto.getFileKeys())) {
|
||||
return Lists.newArrayList();
|
||||
@ -845,7 +847,7 @@ public class FileServiceImpl implements FileService {
|
||||
List<SignUrlDownloadResponse> httpUrlSignResList = this.buildHttpUrlSignResponse(dto);
|
||||
|
||||
//3 构建fileKey入参对象集合
|
||||
List<SignUrlDownloadResponse> fileKeyResList = this.buildFileKeyResponse(dto.getFileKeys(), dto.getBizScene(), dto.getStyle());
|
||||
List<SignUrlDownloadResponse> fileKeyResList = this.buildFileKeyResponse(dto.getFileKeys(), dto.getBizScene(), dto.getStyle(), dto.getHasFileName());
|
||||
//4 1/2/3集合累加
|
||||
httpUrlResList.addAll(fileKeyResList);
|
||||
httpUrlResList.addAll(httpUrlSignResList);
|
||||
@ -856,7 +858,7 @@ public class FileServiceImpl implements FileService {
|
||||
/**
|
||||
* 构建fileKey(非http的入参)的返回对象
|
||||
*/
|
||||
private List<SignUrlDownloadResponse> buildFileKeyResponse(List<String> fileKeys, String bizScene, String style) {
|
||||
private List<SignUrlDownloadResponse> buildFileKeyResponse(List<String> fileKeys, String bizScene, String style, boolean hasFileName) {
|
||||
if (CollectionUtil.isEmpty(fileKeys)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
@ -877,13 +879,13 @@ public class FileServiceImpl implements FileService {
|
||||
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, style);
|
||||
return this.buildFileKeyRespByFile(fileList, bucketTypeMap, bizSceneExpireMap, style, hasFileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过File对象,构建返回集合
|
||||
*/
|
||||
private List<SignUrlDownloadResponse> buildFileKeyRespByFile(List<File> fileList,Map<String, String> bucketTypeMap, Map<String, Long> bizSceneExpireMap, String style) {
|
||||
private List<SignUrlDownloadResponse> buildFileKeyRespByFile(List<File> fileList,Map<String, String> bucketTypeMap, Map<String, Long> bizSceneExpireMap, String style, boolean hasFileName) {
|
||||
List<SignUrlDownloadResponse> responseList = fileList.stream().map(item -> {
|
||||
Long expire = bizSceneExpireMap.get(item.getAppChannelBucketNo());
|
||||
// bucket下的key
|
||||
@ -897,7 +899,7 @@ public class FileServiceImpl implements FileService {
|
||||
.fileKey(item.getFileUuid())
|
||||
.build();
|
||||
case PRIVATE_BUCKET://私有桶 - 临时授权链接 例如 http://xxx.png?Expire=a&AccessKeyId=b&Signature=c&repsonse-content-disposition=d
|
||||
String signUrl = this.fileManager.signUrlDownload(item.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , item.getChannelCode(), item.getFileName(), style);
|
||||
String signUrl = this.fileManager.signUrlDownload(item.getBucketName(), tgtFileKey, Objects.nonNull(expire) ? expire : SIGN_URL_DOWNLOAD_EXPIRE_SECOND , item.getChannelCode(), item.getFileName(), style, hasFileName);
|
||||
return SignUrlDownloadResponse.builder()
|
||||
.signUrl(UrlUtil.httpToHttps(signUrl))
|
||||
.fileKey(item.getFileUuid())
|
||||
@ -952,7 +954,7 @@ public class FileServiceImpl implements FileService {
|
||||
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, dto.getStyle());
|
||||
List<SignUrlDownloadResponse> responseList = this.buildFileKeyResponse(Lists.newArrayList(map.values()), null, dto.getStyle(), dto.getHasFileName());
|
||||
if (CollectionUtil.isEmpty(responseList)) {
|
||||
return httpUrlList.stream().map(item -> SignUrlDownloadResponse.builder().fileKey(item).signUrl(item).build()).collect(Collectors.toList());
|
||||
}
|
||||
@ -1079,7 +1081,9 @@ public class FileServiceImpl implements FileService {
|
||||
Long expiration = this.buildExpiration(dto, scene);
|
||||
//1 调用阿里云/华为云 获取临时授权signUrl
|
||||
SignUrlUploadVo signUrlUpload = this.fileManager.signUrlUpload(fileUploadConfig.getBucketName(), tgtFileKey, dto.getFileName(),expiration
|
||||
, fileUploadConfig.getChannelCode(), StringUtils.isNotBlank(dto.getContentType()) ? dto.getContentType() : "multipart/form-data", appChannelBucket.getBucketType());
|
||||
, fileUploadConfig.getChannelCode()
|
||||
, StringUtils.isNotBlank(dto.getContentType()) ? dto.getContentType() : "multipart/form-data", appChannelBucket.getBucketType()
|
||||
, Objects.isNull(dto.getHasFileName()) ? true: dto.getHasFileName() );
|
||||
//2 保存File对象
|
||||
this.saveOssFile(fileUploadConfig, dto.getFileName(), fileFormat, uuid,
|
||||
signUrlUpload.getDownloadSignUrl(), Utility.getMd5(signUrlUpload.getDownloadSignUrl()), expiration);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user