package com.opencloud.common.utils;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author linfan.sun
* @date 2019/6/2616:10
*/
public class AliyunOSSUtil {
private static final Logger logger = LoggerFactory.getLogger(AliyunOSSUtil.class);
private static String FILE_URL;
// private static String bucketName = null;
// private static String endpoint = null;
// private static String accessKeyId = null;
// private static String accessKeySecret = null;
@Value("${aliyun.oss.bucketName}")
private static String bucketName;
@Value("${aliyun.oss.endpoint}")
private static String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private static String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private static String accessKeySecret;
/**
* 上傳檔案。
*
* @param file 需要上傳的檔案路徑
* @return 如果上傳的檔案是圖檔的話,會傳回圖檔的"URL",如果非圖檔的話會傳回"非圖檔,不可預覽。檔案路徑為:+檔案路徑"
*/
public static String upLoad(File file, String fileHost, String suffix) {
// 預設值為:true
boolean isImage = true;
// 判斷所要上傳的圖檔是否是圖檔,圖檔可以預覽,其他檔案不提供通過URL預覽
try {
Image image = ImageIO.read(file);
isImage = image == null ? false : true;
} catch (IOException e) {
e.printStackTrace();
}
logger.info("------OSS檔案上傳開始--------" + file.getName());
// 檔案名格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
String dateString = sdf.format(new Date()) + "." + suffix; // 20180322010634.jpg
// 判斷檔案
if (file == null) {
return null;
}
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
try {
// 判斷容器是否存在,不存在就建立
if (!ossClient.doesBucketExist(bucketName)) {
ossClient.createBucket(bucketName);
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
ossClient.createBucket(createBucketRequest);
}
// 設定檔案路徑和名稱
// String fileUrl = fileHost + "/" + (dateString + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());
String fileUrl = fileHost + "/" + dateString;
if (isImage) {//如果是圖檔,則圖檔的URL為:....
FILE_URL = "https://" + bucketName + "." + endpoint + "/" + fileUrl;
} else {
FILE_URL = fileUrl;
logger.info("非圖檔,不可預覽。檔案路徑為:" + fileUrl);
}
// 上傳檔案
PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
// 設定權限(公開讀)
ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
if (result != null) {
logger.info("------OSS檔案上傳成功------" + fileUrl);
}
} catch (OSSException oe) {
logger.error(oe.getMessage());
} catch (ClientException ce) {
logger.error(ce.getErrorMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return FILE_URL;
}
/**
* 通過檔案名下載下傳檔案
*
* @param objectName 要下載下傳的檔案名
* @param localFileName 本地要建立的檔案名
*/
public static void downloadFile(String objectName, String localFileName) {
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 下載下傳OSS檔案到本地檔案。如果指定的本地檔案存在會覆寫,不存在則建立。
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName));
// 關閉OSSClient。
ossClient.shutdown();
}
/**
* 删除檔案
* objectName key 位址
*
* @param filePath
*/
public static Boolean delFile(String filePath) {
logger.info("删除開始,objectName=" + filePath);
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 删除Object.
boolean exist = ossClient.doesObjectExist(bucketName, filePath);
if (!exist) {
logger.error("檔案不存在,filePath={}", filePath);
return false;
}
logger.info("删除檔案,filePath={}", filePath);
ossClient.deleteObject(bucketName, filePath);
ossClient.shutdown();
return true;
}
/**
* 批量删除
*
* @param keys
*/
public static Boolean delFileList(java.util.List<String> keys) {
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
try {
// 删除檔案。
DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
java.util.List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
ossClient.shutdown();
}
return true;
}
/**
* 擷取檔案夾
*
* @param fileName
* @return
*/
public static java.util.List<String> fileFolder(String fileName) {
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 構造ListObjectsRequest請求。
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 設定正斜線(/)為檔案夾的分隔符。
listObjectsRequest.setDelimiter("/");
// 設定prefix參數來擷取fun目錄下的所有檔案。
if (StringUtils.isNotBlank(fileName)) {
listObjectsRequest.setPrefix(fileName + "/");
}
// 列出檔案
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 周遊所有commonPrefix
java.util.List<String> list = new ArrayList<>();
for (String commonPrefix : listing.getCommonPrefixes()) {
String newCommonPrefix = commonPrefix.substring(0, commonPrefix.length() - 1);
String[] s = newCommonPrefix.split("/");
list.add(s[1]);
}
// 關閉OSSClient
ossClient.shutdown();
return list;
}
/**
* 列舉檔案下所有的檔案url資訊
*/
public static java.util.List<String> listFile(String fileHost) {
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 構造ListObjectsRequest請求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 設定prefix參數來擷取fun目錄下的所有檔案。
listObjectsRequest.setPrefix(fileHost + "/");
// 列出檔案。
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 周遊所有檔案。
List<String> list = new ArrayList<>();
for (int i = 0; i < listing.getObjectSummaries().size(); i++) {
if (i == 0) {
continue;
}
FILE_URL = "https://" + bucketName + "." + endpoint + "/" + listing.getObjectSummaries().get(i).getKey();
list.add(FILE_URL);
}
// 關閉OSSClient。
ossClient.shutdown();
return list;
}
/**
* 獲得url連結
*
* @param objectName
* @return
*/
public static String getUrl(String objectName) {
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 設定權限(公開讀)
ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
// 設定圖檔處理樣式。
// String style = "image/resize,m_fixed,w_100,h_100/rotate,90";
Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 100);
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
req.setExpiration(expiration);
// req.setProcess(style);
URL signedUrl = ossClient.generatePresignedUrl(req);
// 關閉OSSClient。
logger.info("------OSS檔案檔案資訊--------" + signedUrl.toString());
ossClient.shutdown();
if (signedUrl != null) {
return signedUrl.toString();
}
return null;
}
// 擷取文 MultipartFile 檔案字尾名工具
public static String getSuffix(MultipartFile fileupload) {
String originalFilename = fileupload.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
System.out.println(suffix);
return suffix;
}
/**
* 建立檔案夾
*
* @param folder
* @return
*/
public static String createFolder(String folder) {
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 檔案夾名
final String keySuffixWithSlash = folder;
// 判斷檔案夾是否存在,不存在則建立
if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) {
// 建立檔案夾
ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
logger.info("建立檔案夾成功");
// 得到檔案夾名
OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);
String fileDir = object.getKey();
ossClient.shutdown();
return fileDir;
}
return keySuffixWithSlash;
}
public static String uploadFile(MultipartFile file, String fileHost) {
logger.info("檔案上傳");
String suffix = getSuffix(file);
String filename = file.getOriginalFilename();
try {
if (file != null) {
if (!"".equals(filename.trim())) {
File newFile = new File(filename);
FileOutputStream os = new FileOutputStream(newFile);
os.write(file.getBytes());
os.close();
file.transferTo(newFile);
// 上傳到OSS
String uploadUrl = upLoad(newFile, fileHost, suffix);
return uploadUrl;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static void main(String[] args) {
// createFolder("test/");
// getUrl("product/class/26065946787446951.jpg");
listFile("document");
// fileFolder(null);
// fileFolder("document");
// String bucketUrl = "https://jiangpin.oss-cn-shenzhen.aliyuncs.com/other/20190509023515.jpg";
// String[] s = bucketUrl.split(".com");
// String path = s[1];
// path = path.substring(1, path.length());
// System.out.println(path);
}
}