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個檔案。
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
String KeyPrefix = "<yourKeyPrefix>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 列舉檔案。 如果不設定KeyPrefix,則列舉儲存空間下所有的檔案。KeyPrefix,則列舉包含指定首碼的檔案。
ObjectListing objectListing = ossClient.listObjects(bucketName, KeyPrefix);
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
System.out.println("\t" + s.getKey());
}
// 關閉OSSClient。
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) |
列舉指定個數的檔案
以下代碼用於列舉指定個數的檔案:
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 建立OSSClient執行個體
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 設定最大個數。
final int maxKeys = 200;
// 列舉檔案。
ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMaxKeys(maxKeys));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
System.out.println("\t" + s.getKey());
}
// 關閉OSSClient。
ossClient.shutdown();
列舉指定首碼的檔案
以下代碼用於列舉包含指定首碼(prefix)的檔案:
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 指定首碼。
final String keyPrefix = "<yourkeyPrefix>";
// 列舉包含指定首碼的檔案。預設列舉100個檔案。
ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withPrefix(keyPrefix));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
System.out.println("\t" + s.getKey());
}
// 關閉OSSClient。
ossClient.shutdown();
列舉指定marker之後的檔案
參數marker代表檔案名稱。以下代碼用於列舉指定marker之後的檔案:
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
final String marker = "<yourMarker>";
// 列舉指定marker之後的檔案。預設列舉100個檔案。
ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMarker(marker));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
System.out.println("\t" + s.getKey());
}
// 關閉OSSClient。
ossClient.shutdown();
分頁列舉所有檔案
以下代碼用於分頁列舉指定儲存空間下的所有檔案。每頁列舉的檔案個數通過maxKeys指定。
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
final int maxKeys = 200;
String nextMarker = null;
ObjectListing objectListing;
do {
objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMarker(nextMarker).withMaxKeys(maxKeys));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
System.out.println("\t" + s.getKey());
}
nextMarker = objectListing.getNextMarker();
} while (objectListing.isTruncated());
// 關閉OSSClient。
ossClient.shutdown();
分頁列舉指定marker之後的檔案
以下代碼用於分頁列舉指定maker之後的檔案。每頁列舉的檔案個數通過maxKeys指定。
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
final int maxKeys = 200;
String nextMarker = "<yourNextMarker>";
ObjectListing objectListing;
do {
objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMarker(nextMarker).withMaxKeys(maxKeys));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
System.out.println("\t" + s.getKey());
}
nextMarker = objectListing.getNextMarker();
} while (objectListing.isTruncated());
// 關閉OSSClient。
ossClient.shutdown();
分頁列舉指定首碼的檔案
以下代碼用於分頁列舉包含指定首碼的檔案。
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 指定每頁200個檔案。
final int maxKeys = 200;
final String keyPrefix = "<yourkeyPrefix>";
String nextMarker = "<yourNextMarker>";
ObjectListing objectListing;
do {
objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).
withPrefix(keyPrefix).withMarker(nextMarker).withMaxKeys(maxKeys));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
System.out.println("\t" + s.getKey());
}
nextMarker = objectListing.getNextMarker();
} while (objectListing.isTruncated());
// 關閉OSSClient。
ossClient.shutdown();
指定檔案名稱編碼
如果檔案名稱含有以下特殊字元,需要進行編碼傳輸。OSS目前僅支援url編碼。
- 單引號(’)
- 雙引號(”)
- and符號(&)
- 角括弧(< >)
- 頓號(、)
- 中文
以下代碼用於指定檔案名稱編碼:
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
final int maxKeys = 200;
final String keyPrefix = "<yourkeyPrefix>";
String nextMarker = "<yourNextMarker>";
ObjectListing objectListing;
do {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
listObjectsRequest.setPrefix(keyPrefix);
listObjectsRequest.setMaxKeys(maxKeys);
listObjectsRequest.setMarker(nextMarker);
// 指定檔案名稱編碼。
listObjectsRequest.setEncodingType("url");
objectListing = ossClient.listObjects(listObjectsRequest);
// 檔案解碼。
for (OSSObjectSummary objectSummary: objectListing.getObjectSummaries()) {
System.out.println("Key:" + URLDecoder.decode(objectSummary.getKey(), "UTF-8"));
}
// commonPrefixes解碼。
for (String commonPrefixes: objectListing.getCommonPrefixes()) {
System.out.println("CommonPrefixes:" + URLDecoder.decode(commonPrefixes, "UTF-8"));
}
// nextMarker解碼。
if (objectListing.getNextMarker() != null) {
nextMarker = URLDecoder.decode(objectListing.getNextMarker(), "UTF-8");
}
} while (objectListing.isTruncated());
// 關閉OSSClient。
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,正斜線(/)作為檔案夾的分隔符號。下面的樣本展示了如何模擬檔案夾功能。
列舉儲存空間下所有檔案
以下代碼用於列舉指定儲存空間下的所有檔案:
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 構造ListObjectsRequest請求。
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 列出檔案。
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍曆所有檔案。
System.out.println("Objects:");
for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
// 遍曆所有commonPrefix。
System.out.println("CommonPrefixes:");
for (String commonPrefix : listing.getCommonPrefixes()) {
System.out.println(commonPrefix);
}
// 關閉OSSClient。
ossClient.shutdown();
返回結果如下:
Objects:
fun/movie/001.avi
fun/movie/007.avi
fun/test.jpg
oss.jpg
CommonPrefixes:
列舉指定目錄下所有檔案
以下代碼用於列舉指定目錄下的所有檔案:
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 構造ListObjectsRequest請求。
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 設定prefix參數來獲取fun目錄下的所有檔案。
listObjectsRequest.setPrefix("fun/");
// 遞迴列出fun目錄下的所有檔案。
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍曆所有檔案。
System.out.println("Objects:");
for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
// 遍曆所有commonPrefix。
System.out.println("\nCommonPrefixes:");
for (String commonPrefix : listing.getCommonPrefixes()) {
System.out.println(commonPrefix);
}
// 關閉OSSClient。
ossClient.shutdown();
返回結果如下:
Objects:
fun/movie/001.avi
fun/movie/007.avi
fun/test.jpg
CommonPrefixes:
列舉目錄下的檔案和子目錄
以下代碼用於列舉指定目錄下的檔案和子目錄:
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 構造ListObjectsRequest請求。
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 設定正斜線(/)為檔案夾的分隔符號。
listObjectsRequest.setDelimiter("/");
// 列出fun目錄下的所有檔案和檔案夾。
listObjectsRequest.setPrefix("fun/");
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
// 遍曆所有檔案。
System.out.println("Objects:");
// objectSummaries的列表中給出的是fun目錄下的檔案。
for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
}
// 遍曆所有commonPrefix。
System.out.println("\nCommonPrefixes:");
// commonPrefixs列表中給出的是fun目錄下的所有子檔案夾。fun/movie/001.avi和fun/movie/007.avi兩個檔案沒有被列出來,因為它們屬於fun檔案夾下的movie目錄。
for (String commonPrefix : listing.getCommonPrefixes()) {
System.out.println(commonPrefix);
}
// 關閉OSSClient。
ossClient.shutdown();
返回結果如下:
Objects:
fun/test.jpg
CommonPrefixes:
fun/movie/