

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 列出已啟用版本控制之儲存貯體中的物件
<a name="list-obj-version-enabled-bucket"></a>

本節提供列出已啟用版本控制之儲存貯體中物件版本的範例。Amazon S3 會將物件版本資訊存放至與儲存貯體有關聯的 *versions* 子資源。如需詳細資訊，請參閱[一般用途儲存貯體組態選項](UsingBucket.md#bucket-config-options-intro)。若要列出已啟用版本控制之儲存貯體，您需要 `ListBucketVersions` 許可。

## 使用 S3 主控台
<a name="view-object-versions"></a>

請依照下列步驟使用 Amazon S3 主控台查看某個物件的不同版本。

**查看物件的多個版本**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在**儲存貯體**清單中，選擇包含該物件的儲存貯體名稱。

1. 若要查看儲存貯體中的物件版本清單，請選擇 **Show versions** (顯示版本) 切換開關。

   針對每個物件版本，主控台會顯示唯一版本 ID、物件版本建立日期與時間，以及其他屬性。(設定版本控制狀態之前儲存貯體中所存放的物件會有 **null** 的版本 ID。)

   若只要列出物件而不顯示版本，請選擇 **List versions** (列出版本) 切換開關。

您也可以在主控台的物件概觀面板中檢視、下載及刪除物件版本。如需詳細資訊，請參閱[在 Amazon S3 主控台中檢視物件屬性](view-object-properties.md)。

**注意**  
 若要存取超過 300 個版本的物件版本，您必須使用 AWS CLI 或物件的 URL。

**重要**  
只有在刪除最新版 (目前版本) 的物件時，才能取消刪除物件。您無法取消刪除已刪除的舊版物件。如需詳細資訊，請參閱[使用 S3 版本控制保留多個版本的物件](Versioning.md)。

## 使用 AWS SDKs
<a name="list-obj-version-enabled-bucket-sdk-examples"></a>

本節中的範例會示範如何從已啟用版本控制之儲存貯體中，擷取物件清單。除非您指定較小的數值，否則每個請求最多可回傳 1,000 個版本。如果儲存貯體含有比限制數量更多的版本，則您需要傳送一連串可擷取所有版本清單的要求。在「頁面」中傳回結果的過程稱為*分頁*。

為了解說分頁運作方式，這些範例會限制每一個物件版本的回應。在擷取結果的第一頁，每個範例都會檢查以確定是否截斷了版本清單。如果是，則該範例則會繼續擷取頁面，直到擷取到所有版本。

**注意**  
以下範例還適用於尚未啟用版本控制的儲存貯體，或者尚沒有獨立版本的物件。在這些情況下，Amazon S3 會傳回版本 ID 為 `null` 的物件清單。

 如需使用 AWS SDKs的詳細資訊，請參閱 [AWS 開發人員中心](https://aws.amazon.com/code/)。

------
#### [ Java ]

如需建立和測試工作範例的說明，請參閱《 適用於 Java 的 AWS SDK 開發人員指南》中的[入門](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html)。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListVersionsRequest;
import com.amazonaws.services.s3.model.S3VersionSummary;
import com.amazonaws.services.s3.model.VersionListing;

public class ListKeysVersioningEnabledBucket {

    public static void main(String[] args) {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Retrieve the list of versions. If the bucket contains more versions
            // than the specified maximum number of results, Amazon S3 returns
            // one page of results per request.
            ListVersionsRequest request = new ListVersionsRequest()
                    .withBucketName(bucketName)
                    .withMaxResults(2);
            VersionListing versionListing = s3Client.listVersions(request);
            int numVersions = 0, numPages = 0;
            while (true) {
                numPages++;
                for (S3VersionSummary objectSummary : versionListing.getVersionSummaries()) {
                    System.out.printf("Retrieved object %s, version %s\n",
                            objectSummary.getKey(),
                            objectSummary.getVersionId());
                    numVersions++;
                }
                // Check whether there are more pages of versions to retrieve. If
                // there are, retrieve them. Otherwise, exit the loop.
                if (versionListing.isTruncated()) {
                    versionListing = s3Client.listNextBatchOfVersions(versionListing);
                } else {
                    break;
                }
            }
            System.out.println(numVersions + " object versions retrieved in " + numPages + " pages");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

如需有關設定和執行程式碼範例的資訊，請參閱《[適用於 .NET 的 AWS SDK 開發人員指南》中的適用於 .NET 的 SDK 入門](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。 *AWS *

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class ListObjectsVersioningEnabledBucketTest
    {
        static string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main(string[] args)
        {
            s3Client = new AmazonS3Client(bucketRegion);
            GetObjectListWithAllVersionsAsync().Wait();
        }

        static async Task GetObjectListWithAllVersionsAsync()
        {
            try
            {
                ListVersionsRequest request = new ListVersionsRequest()
                {
                    BucketName = bucketName,
                    // You can optionally specify key name prefix in the request
                    // if you want list of object versions of a specific object.

                    // For this example we limit response to return list of 2 versions.
                    MaxKeys = 2
                };
                do
                {
                    ListVersionsResponse response = await s3Client.ListVersionsAsync(request); 
                    // Process response.
                    foreach (S3ObjectVersion entry in response.Versions)
                    {
                        Console.WriteLine("key = {0} size = {1}",
                            entry.Key, entry.Size);
                    }

                    // If response is truncated, set the marker to get the next 
                    // set of keys.
                    if (response.IsTruncated)
                    {
                        request.KeyMarker = response.NextKeyMarker;
                        request.VersionIdMarker = response.NextVersionIdMarker;
                    }
                    else
                    {
                        request = null;
                    }
                } while (request != null);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------

## 使用 REST API
<a name="ListingtheObjectsinaVersioningEnabledBucket"></a>

**Example — 列出儲存貯體中的所有物件版本**  
若要列出儲存貯體中物件的所有版本，請在 `versions` 要求中使用 `GET Bucket` 子資源。Amazon S3 最多能擷取 1,000 個物件，每個物件版本完全算為一個物件。因此，如果儲存貯體包含兩個金鑰 (例如，`photo.gif` 與 `picture.jpg`)，而且第一個金鑰有 990 個版本，第二個金鑰有 400 個版本，單一要求將會擷取 `photo.gif` 的全部 990 個版本，並且只會擷取 `picture.jpg` 的最新 10 個版本。  
Amazon S3 會依存放順序來傳回物件版本，而最近存放的物件會先傳回。  
在 `GET Bucket` 要求中，包含 `versions` 子資源。  

```
1. GET /?versions HTTP/1.1
2. Host: bucketName.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 +0000
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

**Example — 擷取索引鍵的所有版本**  
 若要擷取物件版本子集，您可以使用 `GET Bucket` 的請求參數。如需詳細資訊，請參閱[https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)。  

1. 將 `prefix` 參數設為您想要擷取之物件的索引鍵。

1. 使用 `GET Bucket` 子資源與 `versions` 來傳送 `prefix` 要求。

   `GET /?versions&prefix=objectName HTTP/1.1`

**Example — 使用字首擷取物件**  
下列範例會擷取其金鑰或開頭為 `myObject` 的物件。  

```
1. GET /?versions&prefix=myObject HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```
您可以使用其他要求參數來擷取物件之所有版本的子集。如需詳細資訊，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)。

**Example — 在截斷回應時擷取其他物件清單**  
如果可在 `GET` 要求中傳回的物件數目超過 `max-keys` 的值，則回應會包含 `<isTruncated>true</isTruncated>`，並包含滿足要求但未傳回的第一個金鑰 (在 `NextKeyMarker` 中) 與第一個版本 ID (在 `NextVersionIdMarker` 中)。您可以使用這些傳回的值作為後續要求中的開始位置，以擷取可滿足 `GET` 要求的其他物件。  
使用下列程序可從儲存貯體中擷取可滿足原始 `GET Bucket versions` 要求的其他物件。如需 `key-marker`、`version-id-marker`、`NextKeyMarker` 和 `NextVersionIdMarker` 的詳細資訊，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)。  
以下是滿足原始 `GET` 請求的其他回應：  
+ 將 `key-marker` 的值設為前一個回應的 `NextKeyMarker` 中所傳回的金鑰。
+ 將 `version-id-marker` 的值設為前一個回應的 `NextVersionIdMarker` 中所傳回的版本 ID。
+ 使用 `GET Bucket versions` 與 `key-marker` 來傳送 `version-id-marker` 要求。

**Example — 擷取開頭為所指定索引鍵與版本 ID 的物件**  

```
1. GET /?versions&key-marker=myObject&version-id-marker=298459348571 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

## 使用 AWS CLI
<a name="list-obj-version-enabled-bucket-cli"></a>

以下命令會傳回有關儲存貯體中所有版本的物件的中繼資料。

```
aws s3api list-object-versions --bucket amzn-s3-demo-bucket1
```

如需 `list-object-versions` 的詳細資訊，請參閱《AWS CLI 命令參考》**中的 [https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html)。