import com.aliyun.oss.*;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.PutObjectRequest;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
@Component
public class OSSUtils {
private OSSUtils() {
}
//定義日誌
private static final Logger log = LoggerFactory.getLogger(OSSUtils.class);
// Endpoint以杭州爲例,其它Region請按實際情況填寫。
private static String endpoint;
// 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄RAM控制檯創建RAM賬號。
//"<yourAccessKeyId>"
private static String accessKeyId;
//"<yourAccessKeySecret>"
private static String accessKeySecret;
//OSS 儲存空間 bucket名字 "<yourBucketName>"
private static String bucketName;
//設置URL過期時間爲10年
private static String dirName = "api/";
private final static Date OSS_URL_EXPIRATION = DateUtils.addDays(new Date(), 365 * 10);
private volatile static OSS ossClient;
@Value("${oss.endpoint}")
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
@Value("${oss.accessKeyId}")
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
@Value("${oss.accessKeySecret}")
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
@Value("${oss.bucketName}")
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
private static OSS getOssClient() throws OSSException {
if (Strings.isEmpty(ossClient)) {
synchronized (OSSUtils.class) {
if (Strings.isEmpty(ossClient)) {
// 創建ClientConfiguration實例,按照您的需要修改默認參數。
ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
// 設置OSSClient允許打開的最大HTTP連接數,默認爲1024個。
conf.setMaxConnections(200);
// 設置Socket層傳輸數據的超時時間,默認爲50000毫秒。
conf.setSocketTimeout(10000);
// 設置建立連接的超時時間,默認爲50000毫秒。
conf.setConnectionTimeout(10000);
// 設置從連接池中獲取連接的超時時間(單位:毫秒),默認不超時。
conf.setConnectionRequestTimeout(1000);
// 設置連接空閒超時時間。超時則關閉連接,默認爲60000毫秒。
conf.setIdleConnectionTime(10000);
// 設置失敗請求重試次數,默認爲3次。
// conf.setMaxErrorRetry(5);
// 設置是否支持將自定義域名作爲Endpoint,默認支持。
// conf.setSupportCname(true);
// 設置是否開啓二級域名的訪問方式,默認不開啓。
// conf.setSLDEnabled(true);
// 設置連接OSS所使用的協議(HTTP/HTTPS),默認爲HTTP。
// conf.setProtocol(Protocol.HTTP);
// 設置用戶代理,指HTTP的User-Agent頭,默認爲aliyun-sdk-java。
// conf.setUserAgent("aliyun-sdk-java");
// 設置代理服務器端口。
// conf.setProxyHost("<yourProxyHost>");
// 設置代理服務器驗證的用戶名。
// conf.setProxyUsername("<yourProxyUserName>");
// 設置代理服務器驗證的密碼。
// conf.setProxyPassword("<yourProxyPassword>");
try {
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, conf);
} catch (OSSException e) {
log.error(e.getMessage(), e);
throw new OSSException(e.getMessage(), e);
}
}
}
}
return ossClient;
}
/**
* 上傳文件
*
* @param objectName 表示上傳文件到OSS時需要指定包含文件後綴在內的完整路徑,例如abc/efg/123.jpg。
* @param inputStream
* @return
*/
public static String upload(String objectName, InputStream inputStream) throws OSSException {
objectName = dirName + objectName;
String url = Strings.EMPTY;
if (Strings.isEmpty(objectName) || Strings.isEmpty(inputStream)) {
log.error("上傳文件名或內容不能爲null!");
return Strings.EMPTY;
}
try {
// 創建PutObjectRequest對象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
// 上傳文件。
getOssClient().putObject(putObjectRequest);
url = getUrl(objectName);
} catch (OSSException e) {
log.error(objectName + "oos上傳文件失敗" + e.getMessage(), e);
throw new OSSException(objectName + "oos上傳文件失敗" + e.getMessage(), e);
} finally {
stop();
}
return url;
}
/**
* 上傳文件
*
* @param objectName 表示上傳文件到OSS時需要指定包含文件後綴在內的完整路徑,例如abc/efg/123.jpg。
* @param file
* @return
*/
public static String upload(String objectName, File file) throws OSSException {
objectName = dirName + objectName;
String url = Strings.EMPTY;
if (Strings.isEmpty(objectName) || Strings.isEmpty(file)) {
log.error("上傳文件名或內容不能爲null!");
return Strings.EMPTY;
}
try {
// 創建PutObjectRequest對象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, file);
// 上傳文件。
getOssClient().putObject(putObjectRequest);
url = getUrl(objectName);
} catch (OSSException e) {
log.error(objectName + "oos上傳文件失敗" + e.getMessage(), e);
throw new OSSException(objectName + "oos上傳文件失敗" + e.getMessage(), e);
} finally {
stop();
}
return url;
}
public static String getUrl(String objectName) throws OSSException {
if (Strings.isEmpty(objectName)) {
log.error("objectName 爲null!oss下載文件失敗!");
return Strings.EMPTY;
}
boolean flag = ossClient.doesObjectExist(bucketName, objectName);
if (!flag) {
log.error("oss服務器上文件名===" + objectName + "不存在!");
return Strings.EMPTY;
}
// 創建請求。
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
// HttpMethod爲PUT。
generatePresignedUrlRequest.setMethod(HttpMethod.GET);
// 添加用戶自定義元信息。
// generatePresignedUrlRequest.addUserMetadata("author", "baymax");
// 添加Content-Type。
// generatePresignedUrlRequest.setContentType("application/octet-stream");
// 設置URL過期時間爲1小時。
generatePresignedUrlRequest.setExpiration(OSS_URL_EXPIRATION);
// 生成簽名URL。
URL url = null;
try {
url = getOssClient().generatePresignedUrl(generatePresignedUrlRequest);
} catch (OSSException e) {
log.error(objectName + "oss文件下載失敗" + e.getMessage(), e);
throw new OSSException(objectName + "oss文件下載失敗" + e.getMessage(), e);
} finally {
stop();
}
return url.toString();
}
/**
* 關閉流
*/
public static void stop() {
// if(Strings.isNotEmpty(ossClient)){
// ossClient.shutdown();
// ossClient不設置爲null 因爲是單例的 一直會拿已關閉的連接去訪問 所以一直報網絡錯誤
// ossClient = null;
// }
}
public static String uploadFile(String filePath) {
if (Strings.isEmpty(filePath)) {
return "";
}
File file = new File(filePath);
String fileImgName = FileUtils.getUUIDFileName(filePath, Strings.UUId());
return OSSUtils.upload(fileImgName, file);
}
public static boolean isFile(String objectName) {
boolean flag = false;
try {
flag = getOssClient().doesObjectExist(bucketName, objectName);
} catch (OSSException o) {
log.error(objectName + "oss文件查詢是否存在失敗" + o.getMessage(), o);
} catch (ClientException c) {
log.error(objectName + "oss文件查詢是否存在失敗" + c.getMessage(), c);
} finally {
stop();
}
return flag;
}
public static boolean isNotFile(String objectName) {
return !isFile(objectName);
}
public static void delelteFile(String objectName) {
objectName = dirName + objectName;
try {
if (isNotFile(objectName)) {
return;
}
getOssClient().deleteObject(bucketName, objectName);
} catch (OSSException e) {
log.error(objectName + "oss文件刪除失敗" + e.getMessage(), e);
throw new OSSException(objectName + "oss文件刪除失敗" + e.getMessage(), e);
} finally {
stop();
}
}
}