package com.firefly.performance.core.common;
import com.alibaba.fastjson.JSON;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.firefly.performance.api.enums.oss.TemporaryAccessTokenVO;
import com.firefly.performance.core.entity.auxiliary.AnnexFile;
import com.firefly.performance.core.utils.Assert;
import com.firefly.performance.core.utils.BaseException;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@Slf4j
@Component
@RefreshScope
public class AliyunOSS {
private static String springProfilesActive;
private static Integer accessTime;
@Value("${spring.profiles.active}")
public void setSpringProfilesActive(String springProfilesActive) {
AliyunOSS.springProfilesActive = springProfilesActive;
}
public static Integer getAccessTime() {
return accessTime;
}
@Value("${oss.access.time}")
public void setAccessTime(Integer accessTime) {
AliyunOSS.accessTime = accessTime;
}
//正式
private static final String ENDPOINT = "oss-cn-shanghai.aliyuncs.com";
private static final String END_POINT_STS_FORMAL = "sts.cn-shanghai.aliyuncs.com";
private static final String ACCESS_KEY_ID_FORMAL = "LTAI4G2ASqmcugTXazk6nTAL";
private static final String ACCESS_KEY_SECRET_FORMAL = "AdMItHW9uEa2Rl4rVhJlTqxpoproI0";
private static final String ROLE_ARN = "acs:ram::1446505179830577:role/aliyunosstokengeneratorrole";
private static final String ROLE_SESSION_NAME = "external-username";
private static final String BUCKET_NAME = "hfmpaas";
private static final String M_PAAS_APP_ID = "ONEXAA9E451231640";
private static final String WORK_SPACE_ID = "default";
//文件转码
//地域id
private static final String MPS_REGION_ID = "cn-shanghai";
// RAM账号的AccessKey ID
private static final String ACCESS_KEY_ID = "LTAI4G4SjvSoGep2rAhMgwaq";
// RAM账号Access Key Secret
private static final String ACCESS_KEY_SECRET = "UW039YEQRuyO9CjoGLP0VA0ZMafF16";
private static final String OSS_LOCATION = "oss-cn-shanghai";
//管道id
private static final String PIPELINE_ID = "4faa3fc58df949579f00bb6839bd5ff7";
//任务系统获取token
private static final String CRM_ACCESS_KEY_ID = "LTAI5tBr2TneFkWTYTjNB4SG";
private static final String CRM_ACCESS_KEY_SECRET = "re06VHDJW8hifj6ZMmZYBLWvy2xfDc";
private static final String CRM_ROLE_ARN = "acs:ram::1499450746592740:role/aliyunosstokengeneratorrole";
private static final String CRM_BUCKET_NAME = "rh-firefly";
/**
* 阿里云任务系统获取token
*
* @return
*/
public static TemporaryAccessTokenVO taskGetToken() {
log.info("开始获取临时访问凭证");
TemporaryAccessTokenVO tokenVO = null;
try {
// 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
DefaultProfile.addEndpoint("", "", "Sts", END_POINT_STS_FORMAL);
// 构造default profile(参数留空,无需添加region ID)
IClientProfile profile = DefaultProfile.getProfile("", ACCESS_KEY_ID_FORMAL, ACCESS_KEY_SECRET_FORMAL);
// 用profile构造client
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setMethod(MethodType.POST);
request.setRoleArn(ROLE_ARN);
request.setRoleSessionName(ROLE_SESSION_NAME);
// 若policy为空,则用户将获得该角色下所有权限
request.setPolicy(null);
// 设置凭证有效时间
request.setDurationSeconds(Long.valueOf(accessTime));
final AssumeRoleResponse response = client.getAcsResponse(request);
Assert.fail(response == null, "STS获取临时访问凭证响应为空!");
tokenVO = new TemporaryAccessTokenVO();
tokenVO.setKeyId(response.getCredentials().getAccessKeyId());
tokenVO.setKeySecret(response.getCredentials().getAccessKeySecret());
tokenVO.setSecurityToken(response.getCredentials().getSecurityToken());
log.info("结束获取临时访问凭证:{}", JSON.toJSONString(tokenVO));
return tokenVO;
} catch (ClientException e) {
log.error("异常原因:{}",e);
}
return tokenVO;
}
/**
* 阿里云任务系统获取token - 蜂鸟桶
*
* @return
*/
public static TemporaryAccessTokenVO fnTaskGetToken() {
log.info("开始获取fn临时访问凭证");
TemporaryAccessTokenVO tokenVO = null;
try {
// 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
DefaultProfile.addEndpoint("", "", "Sts", END_POINT_STS_FORMAL);
// 构造default profile(参数留空,无需添加region ID)
IClientProfile profile = DefaultProfile.getProfile("", CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
// 用profile构造client
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setMethod(MethodType.POST);
request.setRoleArn(CRM_ROLE_ARN);
request.setRoleSessionName(ROLE_SESSION_NAME);
// 若policy为空,则用户将获得该角色下所有权限
request.setPolicy(null);
// 设置凭证有效时间
request.setDurationSeconds(Long.valueOf(accessTime));
final AssumeRoleResponse response = client.getAcsResponse(request);
Assert.fail(response == null, "STS获取临时访问凭证响应为空!");
tokenVO = new TemporaryAccessTokenVO();
tokenVO.setKeyId(response.getCredentials().getAccessKeyId());
tokenVO.setKeySecret(response.getCredentials().getAccessKeySecret());
tokenVO.setSecurityToken(response.getCredentials().getSecurityToken());
log.info("结束获取fn临时访问凭证:{}", JSON.toJSONString(tokenVO));
return tokenVO;
} catch (ClientException e) {
log.error("异常原因:{}",e);
}
return tokenVO;
}
/**
* sts上传文件
*/
public static String stsUploadFile(String keyId, String keySecret, String securityToken, MultipartFile file) {
// 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。
// 创建OSSClient实例。注意,这里使用到了上一步生成的临时访问凭证(STS访问凭证)。
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, keyId, keySecret, securityToken);
// String type = FileTypeEnum.VIDEO.getType().equals(fileType) ? "video/" : "test/picture/";
boolean sign = false;
try {
// 创建PutObjectRequest对象。
InputStream stream = file.getInputStream();
//判断文件类型
//PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, type + file.getOriginalFilename(), stream);
PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, file.getOriginalFilename(), stream);
// 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// 上传文件。
ossClient.putObject(putObjectRequest);
} catch (Exception e) {
sign = true;
log.error("异常原因:{}",e);
} finally {
// 关闭OSSClient。
ossClient.shutdown();
}
Assert.fail(sign, "文件上传失败!");
return file.getOriginalFilename();
}
/**
* oss删除文件
*
* @param filePath
*/
public static void delFile(String filePath, String coverPicture, String fluencyFilePath, String normFilePath, String highDefinitionFilePath) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID_FORMAL, ACCESS_KEY_SECRET_FORMAL);
// 删除文件或目录。如果要删除目录,目录必须为空。
//删除单个
/**
* String type = FileTypeEnum.VIDEO.getType().equals(fileType) ? "video/" : "test/picture/";
* ossClient.deleteObject(BUCKETNAME, filePath);
* ossClient.deleteObject(BUCKETNAME, coverPicture);
*/
//删除多个
List<String> keys = new ArrayList<>();
keys.add(filePath);
if (coverPicture != null && !"".equals(coverPicture)) {
keys.add(coverPicture);
}
if (fluencyFilePath != null) {
keys.add(fluencyFilePath);
}
if (normFilePath != null) {
keys.add(normFilePath);
}
if (highDefinitionFilePath != null) {
keys.add(highDefinitionFilePath);
}
DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(BUCKET_NAME).withKeys(keys));
List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
// 关闭OSSClient。
ossClient.shutdown();
}
/**
* oss删除文件
*
* @param filePath
*/
public static void delFileByCrmFilePath(String filePath) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
// 删除文件或目录。如果要删除目录,目录必须为空。
//删除单个
ossClient.deleteObject(CRM_BUCKET_NAME, filePath);
// 关闭OSSClient。
ossClient.shutdown();
}
/**
* 获取文件临时访问url
*
* @param fileName
* @return
*/
public static String getTemporaryUrl(String fileName) {
TemporaryAccessTokenVO temporaryAccessToken = taskGetToken();
if (temporaryAccessToken==null){
return null;
}
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build("https://" + ENDPOINT, temporaryAccessToken.getKeyId(), temporaryAccessToken.getKeySecret(), temporaryAccessToken.getSecurityToken());
// 设置URL过期时间为10分钟。
Date expiration = new Date(System.currentTimeMillis() + 600 * 1000);
// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
URL url = ossClient.generatePresignedUrl(BUCKET_NAME, fileName, expiration);
log.info("生成临时url:{}", JSON.toJSONString(url));
// 关闭OSSClient。
ossClient.shutdown();
return url.toString();
}
// 使用签名URL进行临时授权
public static URL accessByStsGetDemo() {
/**** 获取临时访问凭证 START ****/
//构建一个阿里云客户端,用于发起请求。
//设置调用者(RAM用户或RAM角色)的AccessKey ID和AccessKey Secret。
DefaultProfile profile = DefaultProfile.getProfile(MPS_REGION_ID, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
IAcsClient client = new DefaultAcsClient(profile);
//构造请求,设置参数。
AssumeRoleRequest request = new AssumeRoleRequest();
request.setRegionId(MPS_REGION_ID);
request.setRoleArn(CRM_ROLE_ARN);
request.setRoleSessionName(ROLE_SESSION_NAME);
//发起请求,并得到响应。
AssumeRoleResponse response = null;
try {
response = client.getAcsResponse(request);
log.info(new Gson().toJson(response));
} catch (ClientException e) {
log.info("ErrCode:{}", e.getErrCode());
log.info("ErrMsg:{}", e.getErrMsg());
log.info("RequestId:{}", e.getRequestId());
} catch (Exception ex) {
log.error("异常原因:{}",ex);
}
/**** 获取临时访问凭证 START ****/
if (response==null||response.getCredentials()==null){
return null;
}
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-shanghai.aliyuncs.com";
// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
String accessKeyId = response.getCredentials().getAccessKeyId();
String accessKeySecret = response.getCredentials().getAccessKeySecret();
// 从STS服务获取的安全令牌(SecurityToken)。
String securityToken = response.getCredentials().getSecurityToken();
// 填写Bucket名称,例如examplebucket。
String bucketName = CRM_BUCKET_NAME;
// 填写Object完整路径,例如exampleobject.txt。Object完整路径中不能包含Bucket名称。
String objectName = "upms/prod/2022/07/25/霍冬琴.png";
// 从STS服务获取临时访问凭证后,您可以通过临时访问密钥和安全令牌生成OSSClient。
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);
URL url = null;
try {
// 设置签名URL过期时间,单位为毫秒。
Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
log.info("{}",url);
} catch (OSSException oe) {
log.info("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
log.info("Error Message:{}", oe.getErrorMessage());
log.info("Error Code:{}", oe.getErrorCode());
log.info("Request ID:{}", oe.getRequestId());
log.info("Host ID:{}", oe.getHostId());
} catch (Exception ce) {
log.info("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
log.info("Error Message:{}", ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return url;
}
/**
* 获取单个文件的URL(私有Object)
*
* @param endpoint 地址
* @param bucketName 桶名
* @param objectName 文件地址
*/
public static String genOssFileTempUrlByPrivate(String endpoint, String bucketName, String objectName) {
// 接口文档地址:https://help.aliyun.com/document_detail/39607.htm?spm=a2c4g.11186623.0.0.11a62cb76fROaf#concept-39607-zh
// 私有Object
/**** 获取临时访问凭证 START ****/
//构建一个阿里云客户端,用于发起请求。
//设置调用者(RAM用户或RAM角色)的AccessKey ID和AccessKey Secret。
DefaultProfile profile = DefaultProfile.getProfile(MPS_REGION_ID, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
IAcsClient client = new DefaultAcsClient(profile);
//构造请求,设置参数。
AssumeRoleRequest request = new AssumeRoleRequest();
request.setRegionId(MPS_REGION_ID);
request.setRoleArn(CRM_ROLE_ARN);
request.setRoleSessionName(ROLE_SESSION_NAME);
//发起请求,并得到响应。
AssumeRoleResponse response = null;
try {
response = client.getAcsResponse(request);
log.info(new Gson().toJson(response));
} catch (ClientException e) {
log.info("ErrCode:{}", e.getErrCode());
log.info("ErrMsg:{}", e.getErrMsg());
log.info("RequestId:{}", e.getRequestId());
} catch (Exception ex) {
log.error("异常原因:{}",ex);
}
/**** 获取临时访问凭证 START ****/
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String fullEndpoint = "https://" + endpoint;
if (response==null||response.getCredentials()==null){
return null;
}
// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
String accessKeyId = response.getCredentials().getAccessKeyId();
String accessKeySecret = response.getCredentials().getAccessKeySecret();
// 从STS服务获取的安全令牌(SecurityToken)。
String securityToken = response.getCredentials().getSecurityToken();
// 从STS服务获取临时访问凭证后,您可以通过临时访问密钥和安全令牌生成OSSClient。
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(fullEndpoint, accessKeyId, accessKeySecret, securityToken);
URL url = null;
try {
// 设置签名URL过期时间,单位为毫秒。
Date expiration = new Date(System.currentTimeMillis()+ Long.valueOf(accessTime));
// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
log.info("{}",JSON.toJSONString(url));
} catch (OSSException oe) {
log.info("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
log.info("Error Message:{}", oe.getErrorMessage());
log.info("Error Code:{}", oe.getErrorCode());
log.info("Request ID:{}", oe.getRequestId());
log.info("Host ID:{}", oe.getHostId());
} catch (Exception ce) {
log.info("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
log.info("Error Message:{}", ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return Objects.isNull(url) ? "" : url.toString();
}
// 上传网络流
public static void uploadFileByNetworkStream(String tempNewOssUrl, String ossPath, String endPoint, String bucketName) {
// 接口文档地址:https://help.aliyun.com/document_detail/84781.html?spm=a2c4g.11186623.0.0.10d2567aA9Cq38
// 上传网络流
/***** 上传网络流 START *****/
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String fullEndpoint = "https://" + endPoint;
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = CRM_ACCESS_KEY_ID;
String accessKeySecret = CRM_ACCESS_KEY_SECRET;
// 填写Bucket名称,例如examplebucket。
// String bucketName = CRM_BUCKETNAME;
// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
// String ossPath = "performance/35/signatureCommunication/宋杨_101_20221018.jpeg";
// 填写网络流地址。
// String tempNewOSSUrl = "https://rh-firefly.oss-cn-shanghai.aliyuncs.com/upms/prod/2022/08/01/%E5%AE%8B%E6%9D%A8.jpeg?Expires=1666061063&OSSAccessKeyId=STS.NTNN7eGRawLU2p3DioGThheki&Signature=ksyby4FWUu0azo9U2WqE2NK6LqE%3D&security-token=CAISiwJ1q6Ft5B2yfSjIr5f7BY3Rqo1AwI6%2BMFaCoGk6S9tEh6DAizz2IH5LdXhuBuEXsf8zmGpZ6Pkalrh%2BW4NIX0rNaY5t9ZlN9wqkbtJxdU0aO%2BRW5qe%2BEE2%2FVjTZvqaLEcibIfrZfvCyESOm8gZ43br9cxi7QlWhKufnoJV7b9MRLGLaBHg8c7UwHAZ5r9IAPnb8LOukNgWQ4lDdF011oAFx%2BwgdgOadupTAu0uC0QWllrFI9t6ufsCeApMybMslYbCcx%2Fdrc6fN6ilU5iVR%2Bb1%2B5K4%2BommY74DDXAgAvE7ab7CFrII3NnxwYqkrBqhDt%2BPgkv51vOPekYntwgpKJ%2FtSVynPyFMnAEJbpIkagAFhEVZk7e96VlZ8Goug82taEGxoQ1QGiU0VTJmES6Ho4qcs%2FBQAEz3NvKolvsLbdJa%2F02%2Fu9LC4nD8Kb4nXnFOOFq6dWSqriXmi3WbsTJQSsae9tGVd437kHvaZuNND6IcqHPNXvJLWlYfJcYHw8%2FBlqJhTzTGybnEvt2qPl4TV1A%3D%3D";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(fullEndpoint, accessKeyId, accessKeySecret);
try {
InputStream inputStream = new URL(tempNewOssUrl).openStream();
// 创建PutObject请求。
ossClient.putObject(bucketName, ossPath, inputStream);
} catch (OSSException oe) {
log.info("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
log.info("Error Message:{}", oe.getErrorMessage());
log.info("Error Code:{}", oe.getErrorCode());
log.info("Request ID:{}", oe.getRequestId());
log.info("Host ID:{}", oe.getHostId());
} catch (Exception ce) {
log.info("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
log.info("Error Message:{}", ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
/***** 上传网络流 End *****/
}
public static String getSignatureCommunicationUrl(String employeeName,Long sheetId,String suffix) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String newFilename = employeeName + "_" + sheetId + "_" + sdf.format(new Date()) + suffix;
return String.format("%s/%s/%s/%s", "performance", springProfilesActive, "signatureCommunication", newFilename);
}
/**
* 字符替换
*
* @param str 字符串
* @return 替换后的字符串
*/
public static String replaceEnter(String str) {
String reg = "[\n-\r]";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
return m.replaceAll("");
}
// 授权访问:使用STS进行临时授权
public static void accessByStsDemo() {
// String ossURL = "http://rh-fengniao.oss-cn-shanghai.aliyuncs.com/upms/prod/2022/07/25/穆相如.png";
/**** 获取临时访问凭证 START ****/
//构建一个阿里云客户端,用于发起请求。
//设置调用者(RAM用户或RAM角色)的AccessKey ID和AccessKey Secret。
DefaultProfile profile = DefaultProfile.getProfile(MPS_REGION_ID, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
IAcsClient client = new DefaultAcsClient(profile);
//构造请求,设置参数。
AssumeRoleRequest request = new AssumeRoleRequest();
request.setRegionId(MPS_REGION_ID);
request.setRoleArn(CRM_ROLE_ARN);
request.setRoleSessionName(ROLE_SESSION_NAME);
//发起请求,并得到响应。
AssumeRoleResponse response = null;
try {
response = client.getAcsResponse(request);
log.info("{}", new Gson().toJson(response));
} catch (ClientException e) {
log.info("ErrCode:{}", e.getErrCode());
log.info("ErrMsg:{}", e.getErrMsg());
log.info("RequestId:{}", e.getRequestId());
} catch (Exception ex) {
log.error("异常原因:{}",ex);
}
/**** 获取临时访问凭证 START ****/
if (response == null || response.getCredentials() == null) {
return;
}
/**** 使用STS临时授权上传和下载文件 START ****/
String endpoint = ENDPOINT;
// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
String accessKeyId = response.getCredentials().getAccessKeyId();
String accessKeySecret = response.getCredentials().getAccessKeySecret();
// 从STS服务获取的安全令牌(SecurityToken)。
String securityToken = response.getCredentials().getSecurityToken();
// 从STS服务获取临时访问凭证后,您可以通过临时访问密钥和安全令牌生成OSSClient。
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);
String pathName = "D:\\tmp\\何依兰.png";
try {
// 执行OSS相关操作,例如上传、下载文件等。
// 上传文件,此处以上传本地文件为例介绍。
// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
//PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(pathName));
//ossClient.putObject(putObjectRequest);
// 下载OSS文件到本地文件。如果指定的本地文件存在则覆盖,不存在则新建。
// 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
ossClient.getObject(new GetObjectRequest(CRM_BUCKET_NAME, "upms/prod/2022/07/25/于行果.png"), new File(pathName));
// 流式下载
// OSSObject ossObject = ossClient.getObject(bucketName, "upms/prod/2022/07/25/何依兰.png");
// BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
// while (true) {
// String line = reader.readLine();
// if (line == null) break;
// log.info("\n" + line);
// }
// String ss = new String(Base64.getEncoder().encode(reader.), Charsets.toCharset("utf-8"));
// log.info("{}",ss);
// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
//reader.close();
// ossObject对象使用完毕后必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
//ossObject.close();
} catch (OSSException oe) {
log.info("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
log.info("Error Message:{}", oe.getErrorMessage());
log.info("Error Code:{}", oe.getErrorCode());
log.info("Request ID:{}", oe.getRequestId());
log.info("Host ID:{}", oe.getHostId());
} catch (Exception ioe) {
log.error("异常原因:{}",ioe);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
/**** 使用STS临时授权上传和下载文件 END ****/
}
/**
* 上传流
*
* @param objectPath 文件路径
* @param file web端上传的文件
* @return 上传结果
*/
public static Boolean upload(String objectPath, MultipartFile file) {
OSS ossClient = null;
boolean uploadResult = false;
try {
// 创建OSSClient实例。
ossClient = new OSSClientBuilder().build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
// 判断oss是否已经有路径的文件
boolean exist = ossClient.doesObjectExist(CRM_BUCKET_NAME, objectPath);
// coverOnExist == false 时,如果已存在(objectPath&&bucketName都相同),则抛出异常
Assert.fail(exist, "oss已存在同名文件!");
// 设置下载附件时附件的文件名称
String originalFilename = file.getOriginalFilename();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentDisposition(String.format("attachment;filename=%s", originalFilename));
PutObjectResult putObjectResult = ossClient.putObject(CRM_BUCKET_NAME, objectPath, file.getInputStream(), metadata);
uploadResult = true;
// 关闭OSSClient。
} catch (IOException e) {
log.error("上传文件异常:", e);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return uploadResult;
}
/**
* 获取oss的原始url
*
* @param objectPath oss文件路径
* @return oss原始的url
*/
public static URL getDownloadUrl(String objectPath) {
OSS ossClient = null;
URL urlResult = null;
try {
// 构造ossClient
ossClient = new OSSClientBuilder().build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
// 构造失效时间
Calendar current = Calendar.getInstance();
current.add(Calendar.MINUTE, 5);
Date expiraAt = current.getTime();
urlResult = ossClient.generatePresignedUrl(CRM_BUCKET_NAME, objectPath, expiraAt);
} catch (Exception e) {
log.error("生成下载url时失败", e);
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return urlResult;
}
public static String uploadFile(MultipartFile multipartFile, String filePath) {
OSS ossClient = (new OSSClientBuilder()).build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
String originalFilename = null;
try {
originalFilename = URLEncoder.encode(multipartFile.getOriginalFilename(), "UTF-8");
} catch (UnsupportedEncodingException e) {
log.error("异常原因:{}",e);
}
String uuid = UUID.randomUUID().toString().replace("-", "");
String ossPath = String.format("%s/%s/%s/%s-%s", "performance", springProfilesActive, filePath, uuid, originalFilename);
boolean sign = false;
try {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentDisposition(String.format("attachment;filename=%s", originalFilename));
ossClient.putObject(CRM_BUCKET_NAME, ossPath, multipartFile.getInputStream(), metadata);
} catch (Exception var11) {
sign = true;
log.info("文件上传失败:{}", var11.getMessage());
} finally {
ossClient.shutdown();
}
Assert.fail(sign, "文件" + originalFilename + "上传失败!");
return ossPath;
}
public static String uploadByInputStream(String filePath, String fileName, InputStream inputStream) {
OSS ossClient = (new OSSClientBuilder()).build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
String uuid = UUID.randomUUID().toString().replace("-", "");
String ossPath = String.format("%s/%s/%s/%s-%s", "performance", springProfilesActive, filePath, uuid, fileName);
boolean sign = false;
try {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentDisposition(String.format("attachment;filename=%s", fileName));
ossClient.putObject(CRM_BUCKET_NAME, ossPath, inputStream, metadata);
} catch (Exception var11) {
sign = true;
log.info("文件上传失败:{}", var11.getMessage());
} finally {
ossClient.shutdown();
}
Assert.fail(sign, "文件" + fileName + "上传失败!");
return ossPath;
}
/**
* 批量下载oss 文件 并打成zip 包 返回到response中
*
* @param annexFiles 附件集合
* @param zipFileName 压缩包文件名
* @param response HttpServletResponse
*/
public static void batchDownLoadOssFile(List<AnnexFile> annexFiles, String zipFileName, HttpServletResponse response) {
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + zipFileName);
BufferedInputStream bis = null;
try(ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());) {
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
int num = 0;
for (AnnexFile annexFile : annexFiles) {
OSSObject ossObject = ossClient.getObject(CRM_BUCKET_NAME, annexFile.getPath());
if (ossObject != null) {
InputStream inputStream = ossObject.getObjectContent();
String zipFile = num + "_" + annexFile.getFileName();
ZipEntry zipEntry = new ZipEntry(zipFile);
zos.putNextEntry(zipEntry);
int bytesRead = 0;
// 向压缩文件中输出数据
while ((bytesRead = inputStream.read()) != -1) {
zos.write(bytesRead);
}
inputStream.close();
zos.closeEntry(); // 当前文件写完,定位为写入下一条项目
ossObject.close();
}
num++;
}
} catch (Exception e) {
log.error("异常原因:{}",e);
} finally {
try {
if (null != bis) {
bis.close();
}
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (IOException e) {
log.error("异常原因:{}",e);
}
}
}
public static void batchDownLoadOssFile1(List<String> filePathList, String zipFileName, HttpServletResponse
response) {
Assert.fail(CollectionUtils.isEmpty(filePathList), "参数不能为空!");
try {
response.reset();
response.setCharacterEncoding("UTF-8");
// 不同类型的文件对应不同的MIME类型
response.setContentType("application/x-msdownload");
// inline在浏览器中直接显示,不提示用户下载
// attachment弹出对话框,提示用户进行下载保存本地
// 默认为inline方式
response.setHeader("Content-Disposition", "attachment;filename=" + zipFileName);
// --设置成这样可以不用保存在本地,再输出, 通过response流输出,直接输出到客户端浏览器中。
ZipOutputStream zos = null;
zos = new ZipOutputStream(response.getOutputStream());
zipFile(filePathList, zos);
} catch (IOException e) {
log.error("异常原因:{}",e);
throw new BaseException("下载失败!");
}
}
/**
* 压缩文件
*
* @param filePaths 需要压缩的文件路径集合
* @throws IOException
*/
private static void zipFile(List<String> filePaths, ZipOutputStream zos) throws IOException {
//设置读取数据缓存大小
byte[] buffer = new byte[4096];
BufferedInputStream bis = null;
try {
//循环读取文件路径集合,获取每一个文件的路径
for (String filePath : filePaths) {
File inputFile = new File(filePath);
//判断文件是否存在
if (inputFile.exists()) {
//判断是否属于文件,还是文件夹
//创建输入流读取文件
bis = new BufferedInputStream(new FileInputStream(inputFile));
//将文件写入zip内,即将文件进行打包
zos.putNextEntry(new ZipEntry(inputFile.getName()));
//写入文件的方法,同上
int size = 0;
//设置读取数据缓存大小
while ((size = bis.read(buffer)) > 0) {
zos.write(buffer, 0, size);
}
//关闭输入输出流
zos.closeEntry();
bis.close();
}
}
} finally {
if (null != bis) {
try {
bis.close();
} catch (IOException e) {
log.error("异常原因:{}",e);
}
}
if (null != zos) {
try {
zos.close();
} catch (IOException e) {
log.error("异常原因:{}",e);
}
}
}
}
}
Aliyun工具类
最新推荐文章于 2024-05-31 10:46:10 发布