AmazonS3 for java
官方文檔:https://docs.aws.amazon.com/zh_cn/sdk-for-java/v1/developer-guide/welcome.html
感謝大神分享https://blog.csdn.net/u012147490/article/details/53097459
Amazon S3是一種雲上的存儲服務器,其功能僅在於存儲。和普通的服務器不同,它沒有操作界面,連一般的SSH命令登錄功能都沒有。和它打交道的話,一種辦法是用它的管理界面,另一種是借助其編程接口。
Amazon S3 特意內置了著重於簡易性和穩健性的最小功能集。以下是 Amazon S3 服務的一些優勢:
創建存儲桶 – 創建和命名存儲數據的存儲桶。存儲桶是 Amazon S3
在存儲桶中存儲數據 – 在存儲桶中存儲無限量的數據。可將所需數量的對象上傳到 Amazon S3 存儲桶。每個數據元可包含最多 5 TB 的數據。使用開發人員分配的唯一密鑰存儲和檢索每個對象。
下載數據 – 下載您的數據或允許其他人進行下載。隨時下載您的數據或允許其他人執行相同的操作。
權限 - 對於要在您的 Amazon S3 存儲桶中上傳或下載數據的其他人員,您可以授予其訪問權限或拒絕其訪問。將上傳和下載的許可授予三種類型的用戶。身份驗證機制可幫助確保數據安全,以防未授權訪問。
標準接口 – 使用基於標準的 REST 和 SOAP 接口,它們可與任何 Internet 開發工具包搭配使用。
Note
HTTP 上的 SOAP 支持已棄用,但是仍可在 HTTPS 上使用。對於 SOAP 將不支持新 Amazon S3 功能。我們建議您使用 REST API 或 AWS 開發工具包。
什麽是Amazon S3?
使用 MSI 安裝程序安裝 AWS CLI (Windows)
名詞和術語
AWS Account:Amazon Web Service Account, 一般一個公司會申請一個帳戶,可以認為管理員帳戶。
IAM User:一般AWS只有少數人掌握,為了操作的方式,添加子帳戶稱為IAM帳戶,每個帳戶有不同的權限。無論是AWS還是IAM帳戶,都有一個Access Key ID和一個Secret Key。在Amazon Web 管理界面上登錄時使用帳戶名,而用編程接口交互時都用的是Access Key ID和Secret Key,其中ID是16個字符,Secret是40個字節。
存儲桶
存儲桶是 Amazon S3 中用於存儲數據元的容器。每個數據元都儲存在一個存儲桶中。例如,如果名為 photos/puppy.jpg 的數據元存儲在 johnsmith 存儲桶中,則可使用 URL http://johnsmith.s3.amazonaws.com/photos/puppy.jpg 對該數據元進行尋址
存儲桶有以下幾種用途:組織最高等級的 Amazon S3 命名空間、識別負責存儲和數據傳輸費用的賬戶、在訪問控制中發揮作用以及用作使用率報告的匯總單位。
Access Control:S3上的Object默認是不能public訪問的,這意味著,你上傳一個Object的Key=photos/puppy.jpg,並不能直接通過http://johnsmith.s3.amazonaws.com/photos/puppy.jpg 直接訪問,會提示Access Denied,只要在設置權限(ACL或Policy之後才可以訪問)。
對象
數據元是 Amazon S3 中存儲的基本實體。數據元由數據元數據和元數據組成。數據部分對 Amazon S3 不透明。元數據是一組描述數據元的名稱-值對。其中包括一些默認元數據(如上次修改日期)和標準 HTTP 元數據(如 Content-Type)。您還可以在存儲對象時指定自定義元數據。
在存儲桶中,數據元將由密鑰(名稱)和版本 ID 進行唯一地標識。有關詳細信息,請參閱密鑰和版本控制。
鍵
密鑰是指存儲桶中數據元的唯一標識符。存儲桶內的每個數據元都只能有一個密鑰。由於將存儲桶、密鑰和版本 ID 組合在一起可唯一地標識每個數據元,可將 Amazon S3 視為一種“存儲桶 + 密鑰 + 版本”與數據元本身間的基本數據映射。將 Web 服務終端節點、存儲桶名、密鑰和版本(可選)組合在一起,可唯一地尋址 Amazon S3 中的每個數據元。例如,在 URL http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl 中,“doc”是存儲桶的名稱,而“2006-03-01/AmazonS3.wsdl”是密鑰。
常用操作
選擇AWS 開發工具包
解壓後所有文件夾下的jar包
介紹到這裏,直接貼代碼
//申明變量 /** * keyID */ public static String accessKeyID = "accessKeyID"; /** * key */ public static String secretKey = "secretKey"; /** * 以理解為一個很大的磁儲硬盤,其容量以T為單位 */ public static String bucketName = "bucketName"; /** * 上傳文件地址 */ public static String localPath = "E:XXX/XXX.JPG"; /** * 存儲新對象的鍵 */ public static String s3Path = "amazonS3"; //創建Amazon S3對象 AWSCredentials credentials; AmazonS3 s3Client; credentials = new BasicAWSCredentials(accessKeyID, secretKey); s3Client = new AmazonS3Client(credentials); //設置區域 Region cnnorth1 = Region.getRegion(Regions.CN_NORTH_1); s3Client.setRegion(cnnorth1); /** * 查看所有可用的bucket * @param s3Client */ public static void getAllBucket(AmazonS3 s3Client){ List<Bucket> buckets = s3Client.listBuckets(); for (Bucket bucket : buckets) { System.out.println("Bucket: " + bucket.getName()); } } /** * 查看bucket下所有的object * @param bucketName 存儲桶 */ public static void getAllBucketObject(AmazonS3 s3Client){ ObjectListing objects = s3Client.listObjects(bucketName); do { for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) { System.out.println("Object: " + objectSummary.getKey()); } objects = s3Client.listNextBatchOfObjects(objects); } while (objects.isTruncated()); } /** * amazonS3文件上傳 * @param s3Client * @param bucketName 保存到某個存儲桶 * @param key 保存文件的key (以key-value形式保存) * @param file 上傳文件 */ public static void amazonS3Upload(AmazonS3 s3Client,String bucketName,String key,File file){ PutObjectResult result=s3Client.putObject(new PutObjectRequest(bucketName, key, file)); System.out.println("PutObjectResult: "+result.toString()); } /** * amazonS3文件下載 * @param s3Client * @param bucketName 下載某個存儲桶的數據 * @param key 下載文件的key * @param targetFilePath 下載文件保存地址 */ public static void amazonS3Downloading(AmazonS3 s3Client,String bucketName,String key,String targetFilePath){ S3Object object = s3Client.getObject(new GetObjectRequest(bucketName,key)); if(object!=null){ System.out.println("Content-Type: " + object.getObjectMetadata().getContentType()); InputStream input = null; FileOutputStream fileOutputStream = null; byte[] data = null; try { //獲取文件流 input=object.getObjectContent(); data = new byte[input.available()]; int len = 0; fileOutputStream = new FileOutputStream(targetFilePath); while ((len = input.read(data)) != -1) { fileOutputStream.write(data, 0, len); } } catch (IOException e) { e.printStackTrace(); }finally{ if(fileOutputStream!=null){ try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if(input!=null){ try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } } } /** * 文件刪除 * @param s3Client * @param bucketName 刪除文件所在存儲桶 * @param key 刪除文件key */ public static void amazonS3DeleteObject(AmazonS3 s3Client,String bucketName,String key){ s3Client.deleteObject(bucketName, key); } /** * 刪除存儲桶 * @param s3Client * @param bucketName 需要刪除的存儲桶 */ public static void amazonS3DeleteBucket(AmazonS3 s3Client,String bucketName){ s3Client.deleteBucket(bucketName); } //在文件比較大的時候,有必要用多線程上傳。(未測試) TransferManager tm = new TransferManager(s3Client); TransferManagerConfiguration conf = tm.getConfiguration(); int threshold = 4 * 1024 * 1024; conf.setMultipartUploadThreshold(threshold); tm.setConfiguration(conf); Upload upload = tm.upload(bucketName, s3Path, new File(localPath)); TransferProgress p = upload.getProgress(); while (upload.isDone() == false) { int percent = (int)(p.getPercentTransfered()); Thread.sleep(500); } // 默認添加public權限 s3Client.setObjectAcl(bucketName, s3Path, CannedAccessControlList.PublicRead);
- 155
- 156
- 157
我也是剛剛使用,不詳細的地方,請大家在API中查看
AmazonS3 for java