阿里云oss上传文件工具类

阿里云oss Maven 依赖

<dependency>
      <groupId>com.aliyun.oss</groupId>
      <artifactId>aliyun-sdk-oss</artifactId>
      <version>3.16.0</version>
</dependency>

 

package com.yucong.office.common.utils.aliyun;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;

@Slf4j
public class OssTools {

    /**
     * 初始化oss
     *
     * @param param
     * @return
     */
    public static OSS initOss(OssBaseParam param) {
        OSS ossClient = new OSSClientBuilder().build(param.getEndpoint(), param.getAccessKeyId(), param.getAccessKeySecret());
        return ossClient;
    }


    /**
     * 不同bucket之间拷贝数据
     *
     * @param ossClient
     * @param sourceBucketName
     * @param sourceObjectName
     * @param targetBucketName 需要拷贝到哪个bucket(目标bucket)
     * @param targetObjectName
     * @return
     */
    public static CopyObjectResult copyBetweenBucket(OSS ossClient, String sourceBucketName, String sourceObjectName, String targetBucketName, String targetObjectName) {
        // 拷贝源Bucket中的对象到目标Bucket中的指定目录下
        CopyObjectRequest request = new CopyObjectRequest(sourceBucketName, sourceObjectName, targetBucketName, targetObjectName);
        CopyObjectResult result = ossClient.copyObject(request);
        ossClient.shutdown();
        return result;
    }

    /**
     * 判断一个bucket可不可以公共读
     *
     * @param ossClient
     * @param bucketName
     * @param closeOssClient 获取到结果后是否需要关闭ossClient ,true:关闭,false:不需要关闭
     * @return
     */
    public static Boolean bucketIsPublicRead(OSS ossClient, String bucketName, Boolean closeOssClient) {
        // 判断Bucket是否允许公共读访问
        try {
            AccessControlList acl = ossClient.getBucketAcl(bucketName);
            if (acl.getCannedACL().equals(CannedAccessControlList.PublicRead) ||
                    acl.getCannedACL().equals(CannedAccessControlList.PublicReadWrite)) {
                // Bucket 是公共读/写的
                return true;
            }
        } catch (Exception e) {
            log.error("判断一个bucket可不可以公共读时异常,bucket={},错误详情:", bucketName, e);
        } finally {
            if (closeOssClient) {
                ossClient.shutdown();
            }
        }
        return false;
    }

    /**
     * 上传单个文件到oss
     *
     * @param ossClient
     * @param file
     * @param bucketName
     * @param targetName
     * @return 返回文件上传后的文件链接地址
     */
    public static String uploadFile(OSS ossClient, File file, String bucketName, String targetName) {
        try {
            ObjectMetadata metadata = new ObjectMetadata();
            // 设置文件的Content-Type
            metadata.setContentType("application/octet-stream");
            ossClient.putObject(bucketName, targetName, file, metadata);
            return getFileUrl(ossClient, bucketName, null, targetName);
        } catch (Exception e) {
            log.error("上传文件到oss过程中出错,错误详情如下:", e);
        } finally {
            //上传完后关闭释放资源
            ossClient.shutdown();
        }
        return null;
    }

    /**
     * 上传文件流到oss
     *
     * @param ossClient
     * @param inputStream
     * @param bucketName
     * @param targetName
     * @return
     */
    public static String uploadInputStream(OSS ossClient, InputStream inputStream, String bucketName, String targetName) {
        try {
            PutObjectRequest request = new PutObjectRequest(bucketName, targetName, inputStream);
            ossClient.putObject(request);
            return getFileUrl(ossClient, bucketName, null, targetName);
        } catch (Exception e) {
            log.error("上传文件流到oss异常,bucketName={},targetName={},错误详情:", bucketName, targetName, e);
        } finally {
            //释放资源
            ossClient.shutdown();
        }
        return null;
    }

    /**
     * 获取文件的链接地址
     *
     * @param ossClient
     * @param bucketName
     * @param expirationTimestamp
     * @param targetName
     * @return
     */
    public static String getFileUrl(OSS ossClient, String bucketName, Long expirationTimestamp, String targetName) {
        try {
            if (expirationTimestamp == null) {
                //默认链接过期时间为一个小时
                expirationTimestamp = System.currentTimeMillis() + 3600 * 1000;
            }
            Date expiration = new Date(expirationTimestamp);
            URL url = ossClient.generatePresignedUrl(bucketName, targetName, expiration);
            String fileUrl = url.toString(); // 获取文件
            if (bucketIsPublicRead(ossClient, bucketName, false)) {
                 //bucket为公共读的情况
                return fileUrl.substring(0, fileUrl.indexOf("?"));
            } else {
                return fileUrl;
            }
        } catch (Exception e) {
            log.error("获取oss文件地址异常,targetName={},bucketName={},过期时间戳={},错误详情:", targetName, bucketName, expirationTimestamp, e);
        } finally {
            //关闭释放资源
            ossClient.shutdown();
        }
        return null;
    }


    


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章