全部產品
Search
文件中心

Object Storage Service:列舉檔案

更新時間:Aug 30, 2018

OSS檔案按照字母順序排列。您可以通過ossClient.listObjects列出儲存空間下的檔案。listObjects有以下三類參數格式:

  • ObjectListing listObjects(String bucketName):列舉儲存空間下的檔案。最多列舉100個檔案。
  • ObjectListing listObjects(String bucketName, String prefix): 列舉儲存空間下指定首碼的檔案。最多列舉100個檔案。
  • ObjectListing listObjects(ListObjectsRequest listObjectsRequest):提供多種過濾功能,實現靈活的查詢功能。

ObjectListing的參數如下:

參數 描述 方法
objectSummaries 限定返回的檔案元資訊。 List<OSSObjectSummary> getObjectSummaries()
prefix 本次查詢結果的首碼。 String getPrefix()
delimiter 對檔案名稱進行分組的一個字元。 String getDelimiter()
marker 標明本次列舉檔案的起點。 String getMarker()
maxKeys 列舉檔案的最大個數。 int getMaxKeys()
nextMarker 下一次列舉檔案的起點。 String getNextMarker()
isTruncated 指明是否所有的結果都已經返回。 boolean isTruncated()
commonPrefixes 以delimiter結尾,並有共同首碼的檔案集合。 List<String> getCommonPrefixes()
encodingType 指明返回結果中編碼使用的類型。 String getEncodingType()

listObjects的完整代碼請參見GitHub

簡單列舉檔案

以下代碼用於列舉指定儲存空間下的檔案,預設列舉100個檔案。

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. String KeyPrefix = "<yourKeyPrefix>";
  8. // 建立OSSClient執行個體。
  9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  10. // 列舉檔案。 如果不設定KeyPrefix,則列舉儲存空間下所有的檔案。KeyPrefix,則列舉包含指定首碼的檔案。
  11. ObjectListing objectListing = ossClient.listObjects(bucketName, KeyPrefix);
  12. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  13. for (OSSObjectSummary s : sums) {
  14. System.out.println("\t" + s.getKey());
  15. }
  16. // 關閉OSSClient。
  17. ossClient.shutdown();

通過ListObjectsRequest列舉檔案

通過設定ListObjectsReques的參數實現各種靈活的查詢功能。ListObjectsReques的參數如下:

參數 描述 方法
prefix 限定返回的檔案必須以prefix作為首碼。 setPrefix(String prefix)
delimiter 對檔案名稱進行分組的一個字元。所有名稱包含指定的首碼且第一次出現delimiter字元之間的檔案作為一組元素(commonPrefixes)。 setDelimiter(String delimiter)
marker 列舉指定marker之後的檔案。 setMarker(String marker)
maxKeys 限定此次列舉檔案的最大個數。預設值為100,最大值為1000。 setMaxKeys(Integer maxKeys)
encodingType 請求響應體中檔案名稱採用的編碼方式,目前僅支援url。 setEncodingType(String encodingType)

列舉指定個數的檔案

以下代碼用於列舉指定個數的檔案:

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 建立OSSClient執行個體
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. // 設定最大個數。
  10. final int maxKeys = 200;
  11. // 列舉檔案。
  12. ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMaxKeys(maxKeys));
  13. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  14. for (OSSObjectSummary s : sums) {
  15. System.out.println("\t" + s.getKey());
  16. }
  17. // 關閉OSSClient。
  18. ossClient.shutdown();

列舉指定首碼的檔案

以下代碼用於列舉包含指定首碼(prefix)的檔案:

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 建立OSSClient執行個體。
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. // 指定首碼。
  10. final String keyPrefix = "<yourkeyPrefix>";
  11. // 列舉包含指定首碼的檔案。預設列舉100個檔案。
  12. ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withPrefix(keyPrefix));
  13. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  14. for (OSSObjectSummary s : sums) {
  15. System.out.println("\t" + s.getKey());
  16. }
  17. // 關閉OSSClient。
  18. ossClient.shutdown();

列舉指定marker之後的檔案

參數marker代表檔案名稱。以下代碼用於列舉指定marker之後的檔案:

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 建立OSSClient執行個體。
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. final String marker = "<yourMarker>";
  10. // 列舉指定marker之後的檔案。預設列舉100個檔案。
  11. ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMarker(marker));
  12. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  13. for (OSSObjectSummary s : sums) {
  14. System.out.println("\t" + s.getKey());
  15. }
  16. // 關閉OSSClient。
  17. ossClient.shutdown();

分頁列舉所有檔案

以下代碼用於分頁列舉指定儲存空間下的所有檔案。每頁列舉的檔案個數通過maxKeys指定。

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 建立OSSClient執行個體。
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. final int maxKeys = 200;
  10. String nextMarker = null;
  11. ObjectListing objectListing;
  12. do {
  13. objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMarker(nextMarker).withMaxKeys(maxKeys));
  14. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  15. for (OSSObjectSummary s : sums) {
  16. System.out.println("\t" + s.getKey());
  17. }
  18. nextMarker = objectListing.getNextMarker();
  19. } while (objectListing.isTruncated());
  20. // 關閉OSSClient。
  21. ossClient.shutdown();

分頁列舉指定marker之後的檔案

以下代碼用於分頁列舉指定maker之後的檔案。每頁列舉的檔案個數通過maxKeys指定。

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 建立OSSClient執行個體。
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. final int maxKeys = 200;
  10. String nextMarker = "<yourNextMarker>";
  11. ObjectListing objectListing;
  12. do {
  13. objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMarker(nextMarker).withMaxKeys(maxKeys));
  14. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  15. for (OSSObjectSummary s : sums) {
  16. System.out.println("\t" + s.getKey());
  17. }
  18. nextMarker = objectListing.getNextMarker();
  19. } while (objectListing.isTruncated());
  20. // 關閉OSSClient。
  21. ossClient.shutdown();

分頁列舉指定首碼的檔案

以下代碼用於分頁列舉包含指定首碼的檔案。

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 建立OSSClient執行個體。
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. // 指定每頁200個檔案。
  10. final int maxKeys = 200;
  11. final String keyPrefix = "<yourkeyPrefix>";
  12. String nextMarker = "<yourNextMarker>";
  13. ObjectListing objectListing;
  14. do {
  15. objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).
  16. withPrefix(keyPrefix).withMarker(nextMarker).withMaxKeys(maxKeys));
  17. List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  18. for (OSSObjectSummary s : sums) {
  19. System.out.println("\t" + s.getKey());
  20. }
  21. nextMarker = objectListing.getNextMarker();
  22. } while (objectListing.isTruncated());
  23. // 關閉OSSClient。
  24. ossClient.shutdown();

指定檔案名稱編碼

如果檔案名稱含有以下特殊字元,需要進行編碼傳輸。OSS目前僅支援url編碼。

  • 單引號(’)
  • 雙引號(”)
  • and符號(&)
  • 角括弧(< >)
  • 頓號(、)
  • 中文

以下代碼用於指定檔案名稱編碼:

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 建立OSSClient執行個體。
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. final int maxKeys = 200;
  10. final String keyPrefix = "<yourkeyPrefix>";
  11. String nextMarker = "<yourNextMarker>";
  12. ObjectListing objectListing;
  13. do {
  14. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  15. listObjectsRequest.setPrefix(keyPrefix);
  16. listObjectsRequest.setMaxKeys(maxKeys);
  17. listObjectsRequest.setMarker(nextMarker);
  18. // 指定檔案名稱編碼。
  19. listObjectsRequest.setEncodingType("url");
  20. objectListing = ossClient.listObjects(listObjectsRequest);
  21. // 檔案解碼。
  22. for (OSSObjectSummary objectSummary: objectListing.getObjectSummaries()) {
  23. System.out.println("Key:" + URLDecoder.decode(objectSummary.getKey(), "UTF-8"));
  24. }
  25. // commonPrefixes解碼。
  26. for (String commonPrefixes: objectListing.getCommonPrefixes()) {
  27. System.out.println("CommonPrefixes:" + URLDecoder.decode(commonPrefixes, "UTF-8"));
  28. }
  29. // nextMarker解碼。
  30. if (objectListing.getNextMarker() != null) {
  31. nextMarker = URLDecoder.decode(objectListing.getNextMarker(), "UTF-8");
  32. }
  33. } while (objectListing.isTruncated());
  34. // 關閉OSSClient。
  35. ossClient.shutdown();

檔案夾功能

OSS沒有檔案夾的概念,所有元素都是以檔案來儲存。建立檔案夾本質上來說是建立了一個大小為0並以正斜線(/)結尾的檔案。這個檔案可以被上傳和下載,控制台會對以正斜線(/)結尾的檔案以檔案夾的方式展示。

通過delimiter和prefix兩個參數可以模擬檔案夾功能:

  • 如果設定prefix為某個檔案夾名稱,則會列舉以此prefix開頭的檔案,即該檔案夾下所有的檔案和子檔案夾(目錄),顯示為Objects。
  • 如果再設定delimiter為正斜線(/),則只列舉該檔案夾下的檔案和子檔案夾(目錄),該檔案夾下的子檔案夾(目錄)則顯示為CommonPrefixes,子檔案夾下的檔案和檔案夾不顯示。

檔案夾詳情請參見檔案夾功能。建立檔案的完整代碼請參見GitHub

假設儲存空間中有4個檔案: oss.jpg、fun/test.jpg、fun/movie/001.avi、fun/movie/007.avi,正斜線(/)作為檔案夾的分隔符號。下面的樣本展示了如何模擬檔案夾功能。

列舉儲存空間下所有檔案

以下代碼用於列舉指定儲存空間下的所有檔案:

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 建立OSSClient執行個體。
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. // 構造ListObjectsRequest請求。
  10. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  11. // 列出檔案。
  12. ObjectListing listing = ossClient.listObjects(listObjectsRequest);
  13. // 遍曆所有檔案。
  14. System.out.println("Objects:");
  15. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  16. System.out.println(objectSummary.getKey());
  17. }
  18. // 遍曆所有commonPrefix。
  19. System.out.println("CommonPrefixes:");
  20. for (String commonPrefix : listing.getCommonPrefixes()) {
  21. System.out.println(commonPrefix);
  22. }
  23. // 關閉OSSClient。
  24. ossClient.shutdown();

返回結果如下:

  1. Objects:
  2. fun/movie/001.avi
  3. fun/movie/007.avi
  4. fun/test.jpg
  5. oss.jpg
  6. CommonPrefixes:

列舉指定目錄下所有檔案

以下代碼用於列舉指定目錄下的所有檔案:

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 建立OSSClient執行個體。
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. // 構造ListObjectsRequest請求。
  10. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  11. // 設定prefix參數來獲取fun目錄下的所有檔案。
  12. listObjectsRequest.setPrefix("fun/");
  13. // 遞迴列出fun目錄下的所有檔案。
  14. ObjectListing listing = ossClient.listObjects(listObjectsRequest);
  15. // 遍曆所有檔案。
  16. System.out.println("Objects:");
  17. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  18. System.out.println(objectSummary.getKey());
  19. }
  20. // 遍曆所有commonPrefix。
  21. System.out.println("\nCommonPrefixes:");
  22. for (String commonPrefix : listing.getCommonPrefixes()) {
  23. System.out.println(commonPrefix);
  24. }
  25. // 關閉OSSClient。
  26. ossClient.shutdown();

返回結果如下:

  1. Objects:
  2. fun/movie/001.avi
  3. fun/movie/007.avi
  4. fun/test.jpg
  5. CommonPrefixes:

列舉目錄下的檔案和子目錄

以下代碼用於列舉指定目錄下的檔案和子目錄:

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String bucketName = "<yourBucketName>";
  7. // 建立OSSClient執行個體。
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. // 構造ListObjectsRequest請求。
  10. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  11. // 設定正斜線(/)為檔案夾的分隔符號。
  12. listObjectsRequest.setDelimiter("/");
  13. // 列出fun目錄下的所有檔案和檔案夾。
  14. listObjectsRequest.setPrefix("fun/");
  15. ObjectListing listing = ossClient.listObjects(listObjectsRequest);
  16. // 遍曆所有檔案。
  17. System.out.println("Objects:");
  18. // objectSummaries的列表中給出的是fun目錄下的檔案。
  19. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  20. System.out.println(objectSummary.getKey());
  21. }
  22. // 遍曆所有commonPrefix。
  23. System.out.println("\nCommonPrefixes:");
  24. // commonPrefixs列表中給出的是fun目錄下的所有子檔案夾。fun/movie/001.avi和fun/movie/007.avi兩個檔案沒有被列出來,因為它們屬於fun檔案夾下的movie目錄。
  25. for (String commonPrefix : listing.getCommonPrefixes()) {
  26. System.out.println(commonPrefix);
  27. }
  28. // 關閉OSSClient。
  29. ossClient.shutdown();

返回結果如下:

  1. Objects:
  2. fun/test.jpg
  3. CommonPrefixes:
  4. fun/movie/