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