摘要:參考博客阿里入門配置信息配置文件工具類將文件上傳到阿里本地文件在阿里中保存的可以包含路徑的文件名返回上傳后文件的訪問路徑如果需要上傳時設置存儲類型與訪問權限,請參考以下示例代碼。遍歷所有文件關閉。
參考博客:阿里OSS入門
@Datapublic class AliOSSConfig { private String endpoint; private String accessKeyId; private String accessKeySecret; private String bucketName; private AliOSSConfig(){ Properties properties = new Properties(); try { properties.load(AliOSSConfig.class.getResourceAsStream("/oss/alioss.properties")); } catch (IOException e) { e.printStackTrace(); } endpoint = properties.getProperty("endpoint"); accessKeyId= properties.getProperty("accessKeyId"); accessKeySecret= properties.getProperty("accessKeySecret"); bucketName= properties.getProperty("bucketName"); } private static AliOSSConfig instance = new AliOSSConfig(); public static AliOSSConfig getInstance() { return instance; }}
public class AliOSSUtil { private static final String endpoint = AliOSSConfig.getInstance().getEndpoint(); private static final String accessKeyId = AliOSSConfig.getInstance().getAccessKeyId(); private static final String accessKeySecret = AliOSSConfig.getInstance().getAccessKeySecret(); private static final String bucketName = AliOSSConfig.getInstance().getBucketName(); /** * 將文件上傳到阿里OSS * * @param sourceFilePathName 本地文件 * @param aimFilePathName 在阿里OSS中保存的可以包含路徑的文件名 * @return 返回上傳后文件的訪問路徑 * @throws FileNotFoundException */ public static String upload(String sourceFilePathName, String aimFilePathName) throws FileNotFoundException { FileInputStream is = new FileInputStream(sourceFilePathName); if (aimFilePathName.startsWith("/")) { aimFilePathName = aimFilePathName.substring(1); } // 如果需要上傳時設置存儲類型與訪問權限,請參考以下示例代碼。 ObjectMetadata metadata = new ObjectMetadata(); int indexOfLastDot = aimFilePathName.lastIndexOf("."); String suffix = aimFilePathName.substring(indexOfLastDot); metadata.setContentType(getContentType(suffix)); //避免文件覆蓋 aimFilePathName = aimFilePathName.substring(0, indexOfLastDot) + System.currentTimeMillis() + suffix; PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, aimFilePathName, is); //避免訪問時將圖片下載下來 putObjectRequest.setMetadata(metadata); OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); ossClient.putObject(putObjectRequest); Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100); URL url = ossClient.generatePresignedUrl(bucketName, aimFilePathName, expiration); // 關閉ossClient ossClient.shutdown(); return url.toString(); } /** * 網絡實現(xiàn)上傳頭像到OSS * * @param multipartFile * @return */ public static String upload(MultipartFile multipartFile) throws IOException { // 獲取上傳的文件的輸入流 InputStream inputStream = multipartFile.getInputStream(); // 獲取文件名稱 String fileName = multipartFile.getOriginalFilename(); // 避免文件覆蓋 int i = fileName.lastIndexOf("."); String suffix = fileName.substring(i); fileName = fileName.substring(0, i) + System.currentTimeMillis() + suffix; // 把文件按照日期進行分類 // 獲取當前日期 String datePath = DateTimeFormatter.ISO_DATE.format(LocalDate.now()); // 拼接fileName fileName = datePath + "/" + fileName; // 如果需要上傳時設置存儲類型與訪問權限 ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(getContentType(fileName.substring(fileName.lastIndexOf(".")))); // 上傳文件到OSS時需要指定包含文件后綴在內的完整路徑,例如abc/efg/123.jpg。 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream); putObjectRequest.setMetadata(metadata); OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); ossClient.putObject(putObjectRequest); //文件訪問路徑 Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100); URL url = ossClient.generatePresignedUrl(bucketName, fileName, expiration); // 關閉ossClient ossClient.shutdown(); // 把上傳到oss的路徑返回 return url.toString(); } /** * 返回contentType * * @param FileNameExtension * @return */ private static String getContentType(String FileNameExtension) { if (FileNameExtension.equalsIgnoreCase(".bmp")) { return "image/bmp"; } if (FileNameExtension.equalsIgnoreCase(".gif")) { return "image/gif"; } if (FileNameExtension.equalsIgnoreCase(".jpeg") || FileNameExtension.equalsIgnoreCase(".jpg") || FileNameExtension.equalsIgnoreCase(".png") ) { return "image/jpg"; } return "image/jpg"; } /** * 列舉 指定路徑下所有的文件的文件名 * 如果要列出根路徑下的所有文件,path= "" * * @param path * @return */ public static List<String> listFileName(String path) { List<String> res = new ArrayList<>(); // 構造ListObjectsRequest請求。 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 設置prefix參數(shù)來獲取fun目錄下的所有文件。 listObjectsRequest.setPrefix(path); OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 列出文件。 ObjectListing listing = ossClient.listObjects(listObjectsRequest); // 遍歷所有文件 for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) { System.out.println(objectSummary.getKey()); } // 關閉OSSClient。 ossClient.shutdown(); return res; } /** * 列舉文件下所有的文件url信息 */ public static List<String> listFileUrl(String path) { List<String> res = new ArrayList<>(); // 構造ListObjectsRequest請求 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 設置prefix參數(shù)來獲取fun目錄下的所有文件。 listObjectsRequest.setPrefix(path); OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 列出文件。 ObjectListing listing = ossClient.listObjects(listObjectsRequest); // 遍歷所有文件。 for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) { //文件訪問路徑 Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100); URL url = ossClient.generatePresignedUrl(bucketName, objectSummary.getKey(), expiration); res.add(url.toString()); } // 關閉OSSClient。 ossClient.shutdown(); return res; } /** * 判斷文件是否存在 * * @param objectName * @return */ public static boolean isFileExist(String objectName) { OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); boolean res = ossClient.doesObjectExist(bucketName, objectName); return res; } /** * 通過文件名下載文件 * * @param objectName 要下載的文件名 * @param localFileName 本地要創(chuàng)建的文件名 */ public static void downloadFile(String objectName, String localFileName) { OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 下載OSS文件到本地文件。如果指定的本地文件存在會覆蓋,不存在則新建。 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName)); // 關閉OSSClient。 ossClient.shutdown(); } /** * 刪除文件或目錄 * * @param objectName */ public static void delelteFile(String objectName) { OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); ossClient.deleteObject(bucketName, objectName); ossClient.shutdown(); } /** * 批量刪除文件或目錄 * * @param keys */ public static void deleteFiles(List<String> keys) { OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 刪除文件。 DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys)); java.util.List<String> deletedObjects = deleteObjectsResult.getDeletedObjects(); ossClient.shutdown(); } /** * 創(chuàng)建文件夾 * * @param folder * @return */ public static String createFolder(String folder) { // 文件夾名 final String keySuffixWithSlash = folder; OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 判斷文件夾是否存在,不存在則創(chuàng)建 if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) { // 創(chuàng)建文件夾 ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0])); // 得到文件夾名 OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash); String fileDir = object.getKey(); ossClient.shutdown(); return fileDir; } return keySuffixWithSlash; }}
注意:為了避免OSS鏈接出現(xiàn) connection pool shutdown
錯誤,不要在類中創(chuàng)建了OSSClient對象 ,因為這樣做的話所有方法共用此實例對象,在前端很短的時間內連續(xù)提交,造成異常錯誤。應該將OSSClient對象在方法中創(chuàng)建。
class AliOSSUtilTest { @Test void upload() throws FileNotFoundException { //上傳文件 String url = AliOSSUtil.upload("E://圖片//510.jpg", "/aa/bb/ba.jpg"); System.out.println(url); } @Test void listFileName() { List<String> res = AliOSSUtil.listFileName("aa/"); res.forEach(System.out::println); } @Test void listFileUrl() { List<String> res = AliOSSUtil.listFileUrl("aa/"); res.forEach(System.out::println); } @Test void isFileExist() { boolean res = AliOSSUtil.isFileExist("aa/bb/ab1637160001528.jpg"); System.out.println(res); } @Test void downloadFile() { AliOSSUtil.downloadFile("aa/bb/ab1637160001528.jpg", "d:/aaawer.jpg"); } @Test void delelteFile() { AliOSSUtil.delelteFile("aa/bb/ab1637160001528.jpg"); } @Test void deleteFiles() { List<String> keys = List.of("aa/bb/ab1637160001528.jpg", "aa/bb/ba1637160268079.jpg","aa/bb/cc"); AliOSSUtil.deleteFiles(keys); } @Test void createFolder() { String folder = AliOSSUtil.createFolder("aa/bb/cc"); System.out.println(folder); }}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/123892.html
摘要:筆主很早就開始用阿里云存儲服務當做自己的圖床了。阿里云對象存儲文檔,本篇文章會介紹到整合阿里云存儲服務實現(xiàn)文件上傳下載以及簡單的查看。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術的整合,可能是你遇到的講解最詳細的學習案例,力爭新手也能看懂并且能夠在看完...
摘要:騰訊云和阿里云針對按量計費的云服務器,均要求賬戶內有一定的余額騰訊云好像沒有最低充值要求,充值元即可阿里云要求賬戶內至少有元余額?;谏鲜鲈?,我們分別在騰訊云和阿里云創(chuàng)建最低配版的云數(shù)據庫和。 云計算市場爭奪阿里云作為名副其實的國內業(yè)界第一,名聲非常大,不過最近 IT 之家的事鬧出來之后,我有點慶幸最終沒有選擇它。騰訊云算是業(yè)界老二,而且有著騰訊這個強大的靠山,云服務產品的種類和質量...
摘要:如果使用阿里云函數(shù)計算,您將高峰期每小時的訪問日志,或者低谷期每小時的訪問日志交給一個計算函數(shù)處理,并將處理結果存到中。下面結合阿里云的函數(shù)計算產品來講解各個應用場景中架構以及如何解決的場景中的痛點。 摘要: Serverless概念是近年來特別火的一個技術概念,基于這種架構能構建出很多應用場景,適合各行各業(yè),只要對輕計算、高彈性、無狀態(tài)等場景有訴求的用戶都可以通過本文來普及一些基礎概...
閱讀 2758·2021-11-19 09:40
閱讀 5332·2021-09-27 14:10
閱讀 2110·2021-09-04 16:45
閱讀 1489·2021-07-25 21:37
閱讀 3005·2019-08-30 10:57
閱讀 2990·2019-08-28 17:59
閱讀 1062·2019-08-26 13:46
閱讀 1415·2019-08-26 13:27