【第6期】springboot: 对接阿里云oss对象存储的两个
2020-04-21 本文已影响0人
村中一少
原创文章,转载请注明原文章地址,谢谢!
公司业务需要,对接了阿里云对象存储oss,这篇文章主要分享oss对接的后端封装类以及踩的一些坑。
后端工具类如下:
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.PutObjectResult;
import com.qh.common.exception.BizException;
import org.apache.commons.lang.StringUtils;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Date;
import java.util.UUID;
/**
* @Date: 2019/4/18 8:35
* @Desc:
**/
public class OssUtils {
//阿里云路径前缀
private static String Prefix;
//阿里云EndPoint
private static String EndPoint="oss-cn-beijing.aliyuncs.com";
//阿里云AccessKeyId
private static String AccessKeyId="LTFFFF";
//阿里云AccessKeySecret
private static String AccessKeySecret="SSDRsds";
//阿里云BucketName
private static String BucketName="test";
private static Long keepTimes = 3600 * 24 * 1000 * 365 * 10L; //10年
private static OSSClient client;
static {
client =new OSSClient(EndPoint, AccessKeyId, AccessKeySecret);
}
/**
* 文件上传
* @param data 文件字节数组
* @param path 文件路径,包含文件名
* @return 返回http地址
*/
public static String upload(byte[] data, String path) {
return upload(new ByteArrayInputStream(data), path);
}
public static String upload(InputStream inputStream, String path) {
String url ="";
try {
PutObjectResult putObjectResult = client.putObject(BucketName, path, inputStream);
// 设置这个文件地址的有效时间
Date expiration = new Date(System.currentTimeMillis()+ keepTimes);
url = client.generatePresignedUrl(BucketName, path, expiration).toString();
} catch (Exception e){
throw new BizException("上传文件失败,请检查配置信息", e);
}finally {
// client.shutdown();
}
return url;
}
/**
* 重新获取文件地址
* @param path 图片的url地址
* @return
*/
public static String getDownloadUrl(String path) {
String url ="";
try {
// 设置这个文件地址的有效时间
Date expiration = new Date(System.currentTimeMillis() + keepTimes);
url = client.generatePresignedUrl(BucketName, path, expiration).toString();
} catch (Exception e){
throw new BizException("重新获取文件地址失败,请检查配置信息", e);
}finally {
// client.shutdown();
}
return url;
}
/**
* 文件上传
* @param data 文件字节数组
* @param suffix 后缀
* @return 返回http地址
*/
public static String uploadSuffix(byte[] data, String suffix) {
return upload(data, getPath(Prefix, suffix));
}
public static String uploadSuffix(InputStream inputStream, String suffix) {
return upload(inputStream, getPath(Prefix, suffix));
}
/**
* 文件路径
* @param prefix 前缀
* @param suffix 后缀
* @return 返回上传路径
*/
private static String getPath(String prefix, String suffix) {
//生成uuid
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//文件路径
String path = DateUtils.format(new Date(), "yyyyMMdd") + "/" + uuid;
if(StringUtils.isNotBlank(prefix)){
path = prefix + "/" + path;
}
return path + suffix;
}
}
坑一: 图片有效期问题
发现获取的图片有效期不是10年,而是半年左右,最后发现是
Date expiration = new Date(System.currentTimeMillis()+ keepTimes);
这句代码的问题,不得已,自己封装了一个工具,亲测可用
Date expiration = DateUtils.addDateYears(new Date(),10);
/**
* 对日期的【年】进行加/减
* @param date 日期
* @param years 年数,负数为减
* @return 加/减几年后的日期
*/
public static Date addDateYears(Date date, int years) {
DateTime dateTime = new DateTime(date);
return dateTime.plusYears(years).toDate();
}
坑2:图片上传速度慢,小文件还可以,及时M的文件就不行了
后来查看文档,发现可以用内网上传,即oss-cn-beijing-internal.aliyuncs.com。
但是创建bucket的时候,在【区域】一栏,一定要选择和服务器相同的区域,才能使用内网上传。
说明:关注微信公众号【村中一少】,回复“电子书”按照提示信息获取对应书籍目录序号,如回复【1】,即可获得电子书【研磨设计模式.陈臣.王斌.扫描版.pdf】下载地址,所有电子均为免费。
这些电子书仅仅用于学习,如果喜欢请购买正版图书!请支持原版作者!