摘要:參考博客阿里入門(mén)配置信息配置文件工具類(lèi)將文件上傳到阿里本地文件在阿里中保存的可以包含路徑的文件名返回上傳后文件的訪問(wèn)路徑如果需要上傳時(shí)設(shè)置存儲(chǔ)類(lèi)型與訪問(wèn)權(quán)限,請(qǐng)參考以下示例代碼。遍歷所有文件關(guān)閉。
參考博客:阿里OSS入門(mén)
@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 返回上傳后文件的訪問(wèn)路徑 * @throws FileNotFoundException */ public static String upload(String sourceFilePathName, String aimFilePathName) throws FileNotFoundException { FileInputStream is = new FileInputStream(sourceFilePathName); if (aimFilePathName.startsWith("/")) { aimFilePathName = aimFilePathName.substring(1); } // 如果需要上傳時(shí)設(shè)置存儲(chǔ)類(lèi)型與訪問(wèn)權(quán)限,請(qǐng)參考以下示例代碼。 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); //避免訪問(wèn)時(shí)將圖片下載下來(lái) 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); // 關(guān)閉ossClient ossClient.shutdown(); return url.toString(); } /** * 網(wǎng)絡(luò)實(shí)現(xiàn)上傳頭像到OSS * * @param multipartFile * @return */ public static String upload(MultipartFile multipartFile) throws IOException { // 獲取上傳的文件的輸入流 InputStream inputStream = multipartFile.getInputStream(); // 獲取文件名稱(chēng) String fileName = multipartFile.getOriginalFilename(); // 避免文件覆蓋 int i = fileName.lastIndexOf("."); String suffix = fileName.substring(i); fileName = fileName.substring(0, i) + System.currentTimeMillis() + suffix; // 把文件按照日期進(jìn)行分類(lèi) // 獲取當(dāng)前日期 String datePath = DateTimeFormatter.ISO_DATE.format(LocalDate.now()); // 拼接fileName fileName = datePath + "/" + fileName; // 如果需要上傳時(shí)設(shè)置存儲(chǔ)類(lèi)型與訪問(wèn)權(quán)限 ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(getContentType(fileName.substring(fileName.lastIndexOf(".")))); // 上傳文件到OSS時(shí)需要指定包含文件后綴在內(nèi)的完整路徑,例如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); //文件訪問(wèn)路徑 Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100); URL url = ossClient.generatePresignedUrl(bucketName, fileName, expiration); // 關(guān)閉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<>(); // 構(gòu)造ListObjectsRequest請(qǐng)求。 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 設(shè)置prefix參數(shù)來(lái)獲取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()); } // 關(guān)閉OSSClient。 ossClient.shutdown(); return res; } /** * 列舉文件下所有的文件url信息 */ public static List<String> listFileUrl(String path) { List<String> res = new ArrayList<>(); // 構(gòu)造ListObjectsRequest請(qǐng)求 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 設(shè)置prefix參數(shù)來(lái)獲取fun目錄下的所有文件。 listObjectsRequest.setPrefix(path); OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 列出文件。 ObjectListing listing = ossClient.listObjects(listObjectsRequest); // 遍歷所有文件。 for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) { //文件訪問(wèn)路徑 Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100); URL url = ossClient.generatePresignedUrl(bucketName, objectSummary.getKey(), expiration); res.add(url.toString()); } // 關(guān)閉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; } /** * 通過(guò)文件名下載文件 * * @param objectName 要下載的文件名 * @param localFileName 本地要?jiǎng)?chuàng)建的文件名 */ public static void downloadFile(String objectName, String localFileName) { OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 下載OSS文件到本地文件。如果指定的本地文件存在會(huì)覆蓋,不存在則新建。 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName)); // 關(guān)閉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
錯(cuò)誤,不要在類(lèi)中創(chuàng)建了OSSClient對(duì)象 ,因?yàn)檫@樣做的話所有方法共用此實(shí)例對(duì)象,在前端很短的時(shí)間內(nèi)連續(xù)提交,造成異常錯(cuò)誤。應(yīng)該將OSSClient對(duì)象在方法中創(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); }}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/123892.html
摘要:筆主很早就開(kāi)始用阿里云存儲(chǔ)服務(wù)當(dāng)做自己的圖床了。阿里云對(duì)象存儲(chǔ)文檔,本篇文章會(huì)介紹到整合阿里云存儲(chǔ)服務(wù)實(shí)現(xiàn)文件上傳下載以及簡(jiǎn)單的查看。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術(shù)的整合,可能是你遇到的講解最詳細(xì)的學(xué)習(xí)案例,力爭(zhēng)新手也能看懂并且能夠在看完...
摘要:騰訊云和阿里云針對(duì)按量計(jì)費(fèi)的云服務(wù)器,均要求賬戶(hù)內(nèi)有一定的余額騰訊云好像沒(méi)有最低充值要求,充值元即可阿里云要求賬戶(hù)內(nèi)至少有元余額?;谏鲜鲈颍覀兎謩e在騰訊云和阿里云創(chuàng)建最低配版的云數(shù)據(jù)庫(kù)和。 云計(jì)算市場(chǎng)爭(zhēng)奪阿里云作為名副其實(shí)的國(guó)內(nèi)業(yè)界第一,名聲非常大,不過(guò)最近 IT 之家的事鬧出來(lái)之后,我有點(diǎn)慶幸最終沒(méi)有選擇它。騰訊云算是業(yè)界老二,而且有著騰訊這個(gè)強(qiáng)大的靠山,云服務(wù)產(chǎn)品的種類(lèi)和質(zhì)量...
摘要:如果使用阿里云函數(shù)計(jì)算,您將高峰期每小時(shí)的訪問(wèn)日志,或者低谷期每小時(shí)的訪問(wèn)日志交給一個(gè)計(jì)算函數(shù)處理,并將處理結(jié)果存到中。下面結(jié)合阿里云的函數(shù)計(jì)算產(chǎn)品來(lái)講解各個(gè)應(yīng)用場(chǎng)景中架構(gòu)以及如何解決的場(chǎng)景中的痛點(diǎn)。 摘要: Serverless概念是近年來(lái)特別火的一個(gè)技術(shù)概念,基于這種架構(gòu)能構(gòu)建出很多應(yīng)用場(chǎng)景,適合各行各業(yè),只要對(duì)輕計(jì)算、高彈性、無(wú)狀態(tài)等場(chǎng)景有訴求的用戶(hù)都可以通過(guò)本文來(lái)普及一些基礎(chǔ)概...
閱讀 2836·2021-11-19 09:40
閱讀 5692·2021-09-27 14:10
閱讀 2168·2021-09-04 16:45
閱讀 1569·2021-07-25 21:37
閱讀 3057·2019-08-30 10:57
閱讀 3058·2019-08-28 17:59
閱讀 1115·2019-08-26 13:46
閱讀 1475·2019-08-26 13:27