diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java index 5bfaab7..09e0113 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/AliOssService.java @@ -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); /** * 授权给第三方-上传 diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java index d6f3bc8..4528510 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/HuaWeiCloudService.java @@ -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); /** * 授权给第三方-上传 diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java index 685d9e4..8a2f7b4 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/AliOssServiceImpl.java @@ -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(); - responseHeaderOverrides.setContentDisposition("attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\""); + 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)); diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java index f5c8512..2e828c4 100644 --- a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/impl/HuaWeiCloudServiceImpl.java @@ -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 queryParams = Maps.newHashMap(); try { - queryParams.put("response-content-disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\""); + 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"); } - request.setQueryParams(queryParams); + 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)); diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java index 2b3011a..34d2a65 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java @@ -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 diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java index 897eae1..1b40527 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlDownloadDto.java @@ -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; } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlUploadDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlUploadDto.java index 52d75d8..5afb663 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlUploadDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/SignUrlUploadDto.java @@ -57,4 +57,9 @@ public class SignUrlUploadDto { * 过期时间 */ private Long expiration; + + /** + * 是否带上文件名称 + */ + private Boolean hasFileName = true; } diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java index 81a0fe7..14790d9 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -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: diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java index b9cdd3b..ca3559a 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileByUrlServiceImpl.java @@ -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); diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 96cc4b6..4e5052e 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -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 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 httpUrlSignResList = this.buildHttpUrlSignResponse(dto); //3 构建fileKey入参对象集合 - List fileKeyResList = this.buildFileKeyResponse(dto.getFileKeys(), dto.getBizScene(), dto.getStyle()); + List 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 buildFileKeyResponse(List fileKeys, String bizScene, String style) { + private List buildFileKeyResponse(List fileKeys, String bizScene, String style, boolean hasFileName) { if (CollectionUtil.isEmpty(fileKeys)) { return Lists.newArrayList(); } @@ -877,13 +879,13 @@ public class FileServiceImpl implements FileService { List fileBusinessSceneList = fileBusinessSceneManager.queryByBucketNoAndScene(fileList.stream().map(File::getAppChannelBucketNo).collect(Collectors.toSet()), bizScene); Map 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 buildFileKeyRespByFile(List fileList,Map bucketTypeMap, Map bizSceneExpireMap, String style) { + private List buildFileKeyRespByFile(List fileList,Map bucketTypeMap, Map bizSceneExpireMap, String style, boolean hasFileName) { List 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 responseList = this.buildFileKeyResponse(Lists.newArrayList(map.values()), null, dto.getStyle()); + List 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);