【第6期】springboot: 对接阿里云oss对象存储的两个坑

原创文章,转载请注明原文章地址,谢谢!

公司业务需要,对接了阿里云对象存储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。

image
  但是创建bucket的时候,在【区域】一栏,一定要选择和服务器相同的区域,才能使用内网上传。
image

说明:关注微信公众号【村中一少】,回复“电子书”按照提示信息获取对应书籍目录序号,如回复【1】,即可获得电子书【研磨设计模式.陈臣.王斌.扫描版.pdf】下载地址,所有电子均为免费。

这些电子书仅仅用于学习,如果喜欢请购买正版图书!请支持原版作者!

你可能感兴趣的:(【第6期】springboot: 对接阿里云oss对象存储的两个坑)