阿里雲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;
    }


    


}

 

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