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