需求背景:在开发过程中遇到过需要用户上传文件及下载文件的需求,可文件上传到服务器又会对服务器造成越来越大的压力,这时就考虑把文件放到云上。(这里的云不是天上的云哈~~~)
前期准备:开通腾讯云账号并购买cos。
需准备:cosAPPID,secretID,secretKey,cosBucket(腾讯云内创建)
获取BUCKET代码
/**
* 获取bucket
* @param unionId
* @param hospitalId
* @return
*/
private String getBucket (String unionId,String hospitalId){
//这个我是在数据库里配置的,也可以在配置文件内配置,通个账号也可以写死。
String cosAppid = xxx.getConfigValue(unionId, hospitalId,
HospitalConfigTypeEnumeration.COS_APPID).getValueData();
String cosBucket =xxx.getConfigValue(unionId, hospitalId,
HospitalConfigTypeEnumeration.COS_BUCKET).getValueData();
return cosBucket+"-"+cosAppid;
}
获取cos服务
/**
* 获取cos服务
* @param unionId
* @param hospitalId
* @return
*/
private COSClient getCOSClient(String unionId,String hospitalId){
//获取cosSecretID 可以写死,也可以配置,按自己需求
String cosSecretId =xxx.getConfigValue(unionId, hospitalId,
HospitalConfigTypeEnumeration.COS_SECRETID).getValueData();
String cosSecretKey = xxx.getConfigValue(unionId, hospitalId,
HospitalConfigTypeEnumeration.COS_SECRETKEY).getValueData();
COSCredentials cred = new BasicCOSCredentials(cosSecretId, cosSecretKey);
//cos 服务器
Region region = new Region("ap-shanghai");
ClientConfig clientConfig = new ClientConfig(region);
// 生成 cos 客户端。
COSClient cosClient = new COSClient(cred, clientConfig);
return cosClient;
}
验证文件类型是否符合要求(工具)
/**
* 验证文件类型是否符合要求
*
* @param ext
* @return
* @Description
*/
public static boolean isValidFileExt(String ext) {
ext = ext.toLowerCase(Locale.ENGLISH);
for (String s : FILE_EXT) {
if (s.equalsIgnoreCase(ext)) {
return true;
}
}
return false;
}
上传代码
/**
* 文件上传
* @param file 文件
* @param path 文件名称
* @return 文件地址
* @throws IOException
*/
public String upLoadCos(InputStream file, String path,String unionId,String hospitalId)throws IOException {
//涉及到的地方比较多,建议写个公共模块。
//下面会po出获取桶和cos服务器代码
String bucket = getBucket(unionId, hospitalId);
COSClient cosClient = getCOSClient(unionId, hospitalId);
// 指定要上传到 COS 上对象键
String ext = FilenameUtils.getExtension(path);
if(!isValidFileExt(ext)){
throw new ServiceException("文件类型不支持!");
}
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(file.available());
PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, path, file,objectMetadata);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
return "https://"+putObjectRequest.getBucketName()+".cos.ap-shanghai.myqcloud.com/"+path;
}
上传文件之后就会获取到一串cos的URL:bucketName+cos服务器+文件名
如https://wjytest-1251304050.cos.ap-shanghai.myqcloud.com/457cf133da90c99e121fc4615a6fce13.jpg
不过这个时候打开你会发现是看不到的,这是因为cos进行加密了。这个时候就用到了下面这个获取私有读权限来获取文件了。
获取请求预签名:
/**
* 获取请求预签名 URL
* @param unionId
* @param hospitalId
* @return
* @throws CosClientException
*/
public URL generatePresignedUrl(String unionId,String hospitalId,String picUrl)throws CosClientException{
String bucket = getBucket(unionId, hospitalId);
GeneratePresignedUrlRequest req =
new GeneratePresignedUrlRequest(bucket, picUrl, HttpMethodName.GET);
// 设置签名过期时间(可选), 若未进行设置, 则默认使用 ClientConfig 中的签名过期时间(1小时)
// 这里设置签名在半个小时后过期
Date expirationDate = new Date(System.currentTimeMillis() + 30L * 60L * 1000L);
req.setExpiration(expirationDate);
COSClient cosClient = getCOSClient(unionId, hospitalId);
URL url = cosClient.generatePresignedUrl(req);
log.info(url.toString());
cosClient.shutdown();
return url;
}
然后通过这个接口获取到的URL就可以打开上传的文件了!