

# 删除单个对象
<a name="delete-objects"></a>

您可以使用 Amazon S3 控制台或 DELETE API 从 S3 存储桶中删除单个现有对象。有关删除 Amazon S3 中的对象的更多信息，请参阅[删除 Amazon S3 对象](DeletingObjects.md)。

由于 S3 存储桶中的所有对象都会产生存储费用，因此您应从中删除不再需要的对象。例如，如果您正在收集日志文件，最好在不再需要这些文件时将其删除。您可以将生命周期规则设置为自动删除对象 (如日志文件)。有关更多信息，请参阅 [在存储桶上设置 S3 生命周期配置](how-to-set-lifecycle-configuration-intro.md)。

有关 Amazon S3 特征和定价的信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing)。

## 使用 S3 控制台
<a name="delete-object-console"></a>

请按照以下步骤使用 Amazon S3 控制台从存储桶中删除单个对象。

**警告**  
当您在 Amazon S3 控制台中永久删除对象或指定的对象版本时，删除操作无法撤销。

**删除已启用或暂停版本控制的对象**
**注意**  
 如果已暂停版本控制的桶中某个对象的版本 ID 标记为 `NULL`，则 S3 会永久删除该对象，因为不存在之前的版本。然而，如果在暂停了版本控制的桶中为对象列出了有效的版本 ID，则 S3 为已删除的对象创建删除标记，同时保留该对象的先前版本。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**或**目录存储桶**。

1. 在存储桶列表中，选择要从中删除对象的存储桶的名称。

1. 选择对象，然后选择**删除**。

1. 要确认删除**指定的对象**下的对象列表，请在**删除对象？**文本框中输入 **delete**。

**永久删除已启用版本控制的桶中的特定对象版本**
**警告**  
当您永久删除 Amazon S3 中的特定对象版本时，删除操作无法撤销。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在 **Bucket name**（存储桶名称） 列表中，请选择要从中删除对象的存储桶的名称。

1. 选择您要删除的对象。

1. 选择**显示版本**开关。

1. 选择对象版本，然后选择**删除**。

1. 要确认永久删除**指定的对象**下列出的特定对象版本，请在**删除对象？**文本框中输入 **Permanently delete**。Amazon S3 永久删除特定的对象版本。

**永久删除*未*启用版本控制的 Amazon S3 存储桶中的对象**
**警告**  
当您永久删除 Amazon S3 中的对象时，删除操作无法撤销。此外，对于任何未启用版本控制的桶，删除操作都是永久性的。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**通用存储桶**。

1. 在存储桶列表中，选择要从中删除对象的存储桶的名称。

1. 选择对象，然后选择**删除**。

1. 要确认永久删除**指定的对象**下列出的对象，请在**删除对象？**文本框中输入 **permanently delete**。

**注意**  
如果您在删除对象时遇到任何问题，请参阅[我想永久删除受版本控制的对象](troubleshooting-versioning.md#delete-objects-permanent)。

## 使用 AWS CLI
<a name="delete-object-cli"></a>



要为每个请求删除一个对象，请使用 `DELETE` API。有关更多信息，请参阅 [DELETE Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html)。有关使用 CLI 删除对象的更多信息，请参阅 [delete-object](https://awscli.amazonaws.com/v2/documentation/api/2.0.34/reference/s3api/delete-object.html)。

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

您可以使用 AWS SDK 删除对象。然而，如果您的应用程序需要它，则可以直接发送 REST 请求。有关更多信息，请参阅 *Amazon Simple Storage Service API 参考*中的 [DELETE Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html)。

## 使用 AWS 软件开发工具包
<a name="DeletingOneObject"></a>

以下示例展示了如何使用 AWS SDK 从存储桶中删除对象。有关更多信息，请参阅 *Amazon Simple Storage Service API 参考*中的 [DELETE Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html)

如果已对存储桶启用 S3 版本控制，您将可使用以下选项：
+ 通过指定版本 ID 来删除特定对象版本。
+ 删除对象而不指定版本 ID，在这种情况下，Amazon S3 将向对象添加一个删除标记。

有关 S3 版本控制的更多信息，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。

有关更多示例以及其它语言的示例，请参阅《Amazon S3 API reference》**中的 [Use `DeleteObject` with an AWS SDK or CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_DeleteObject_section.html)。

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

要使用适用于 Java 的 AWS SDK 删除对象，可以删除受版本控制和不受版本控制的存储桶中的对象：
+ *不受版本控制的存储桶：*在删除请求中，您仅指定对象键而不指定版本 ID。
+ *受版本控制的存储桶：*可以通过同时指定对象键名称和版本 ID 来删除特定的对象版本。如果对象没有其他版本，则 Amazon S3 将完全删除对象。否则，Amazon S3 仅删除指定版本。
**注意**  
可以通过发送 `ListVersions` 请求来获取对象的版本 ID。

有关如何使用适用于 Java 的 AWS SDK 删除单个对象的示例，请参阅《Amazon S3 API Reference》**中的 [Delete an object](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_DeleteObject_section.html)。

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

以下示例演示如何删除受版本控制和不受版本控制的存储桶中的对象。有关 S3 版本控制的更多信息，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。

**Example 删除不受版本控制的存储桶中的对象**  
以下 C\$1 示例将删除不受版本控制的存储桶中的对象。该示例假定对象没有版本 ID，因此您未指定版本 ID。您仅指定了对象键。  
有关设置和运行代码示例的信息，请参阅《适用于 .NET 的 AWS SDK 开发人员指南》**中的[适用于 .NET 的 AWS SDK 入门](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。  

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

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

        public static void Main()
        {
            client = new AmazonS3Client(bucketRegion);
            DeleteObjectNonVersionedBucketAsync().Wait();
        }
        private static async Task DeleteObjectNonVersionedBucketAsync()
        {
            try
            {
                var deleteObjectRequest = new DeleteObjectRequest
                {
                    BucketName = bucketName,
                    Key = keyName
                };

                Console.WriteLine("Deleting an object");
                await client.DeleteObjectAsync(deleteObjectRequest);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when deleting an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when deleting an object", e.Message);
            }
        }
    }
}
```

**Example 删除受版本控制的存储桶中的对象**  
以下 C\$1 示例将删除受版本控制的存储桶中的对象。它将通过指定对象键名和版本 ID 来删除对象的特定版本。  
代码将执行以下任务：  

1. 对指定的存储桶启用版本控制（如果已启用 S3 版本控制，则此操作无效）。

1. 向存储桶添加示例对象。作为响应，Amazon S3 将返回新添加的对象的版本 ID。该示例将在删除请求中使用此版本 ID。

1. 通过指定对象键名和版本 ID 来删除示例对象。
**注意**  
还可以通过发送 `ListVersions` 请求来获取对象的版本 ID。  

   ```
   var listResponse = client.ListVersions(new ListVersionsRequest { BucketName = bucketName, Prefix = keyName }); 
   ```
有关设置和运行代码示例的信息，请参阅《适用于 .NET 的 AWS SDK 开发人员指南》**中的[适用于 .NET 的 AWS SDK 入门](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。  

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

namespace Amazon.DocSamples.S3
{
    class DeleteObjectVersion
    {
        private const string bucketName = "*** versioning-enabled bucket name ***";
        private const string keyName = "*** Object Key Name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 client;

        public static void Main()
        {
            client = new AmazonS3Client(bucketRegion);
            CreateAndDeleteObjectVersionAsync().Wait();
        }

        private static async Task CreateAndDeleteObjectVersionAsync()
        {
            try
            {
                // Add a sample object. 
                string versionID = await PutAnObject(keyName);

                // Delete the object by specifying an object key and a version ID.
                DeleteObjectRequest request = new DeleteObjectRequest
                {
                    BucketName = bucketName,
                    Key = keyName,
                    VersionId = versionID
                };
                Console.WriteLine("Deleting an object");
                await client.DeleteObjectAsync(request);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when deleting an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when deleting an object", e.Message);
            }
        }

        static async Task<string> PutAnObject(string objectKey)
        {
            PutObjectRequest request = new PutObjectRequest
            {
                BucketName = bucketName,
                Key = objectKey,
                ContentBody = "This is the content body!"
            };
            PutObjectResponse response = await client.PutObjectAsync(request);
            return response.VersionId;
        }
    }
}
```

------
#### [ PHP ]

本示例演示如何使用第 3 版 适用于 PHP 的 AWS SDK 中的类删除不受版本控制的存储桶中的对象。有关从受版本控制的存储桶中删除对象的信息，请参阅 [使用 REST API](DeletingAnObjectsUsingREST.md)。

有关适用于 Ruby 的 AWS 开发工具包 API 的更多信息，请转到[适用于 Ruby 的 AWS 开发工具包 – 版本 2](https://docs.aws.amazon.com/sdkforruby/api/index.html)。

下面的 PHP 示例将删除存储桶中的对象。由于此示例演示如何删除不受版本控制的存储桶中的对象，因此它在删除请求中仅提供存储桶名称和对象键（而不是版本 ID）。

```
<?php

require 'vendor/autoload.php';

use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';

$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

// 1. Delete the object from the bucket.
try
{
    echo 'Attempting to delete ' . $keyname . '...' . PHP_EOL;

    $result = $s3->deleteObject([
        'Bucket' => $bucket,
        'Key'    => $keyname
    ]);

    if ($result['DeleteMarker'])
    {
        echo $keyname . ' was deleted or does not exist.' . PHP_EOL;
    } else {
        exit('Error: ' . $keyname . ' was not deleted.' . PHP_EOL);
    }
}
catch (S3Exception $e) {
    exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
}

// 2. Check to see if the object was deleted.
try
{
    echo 'Checking to see if ' . $keyname . ' still exists...' . PHP_EOL;

    $result = $s3->getObject([
        'Bucket' => $bucket,
        'Key'    => $keyname
    ]);

    echo 'Error: ' . $keyname . ' still exists.';
}
catch (S3Exception $e) {
    exit($e->getAwsErrorMessage());
}
```

------
#### [ Javascript ]

```
import { DeleteObjectCommand } from "@aws-sdk/client-s3";
import { s3Client } from "./libs/s3Client.js" // Helper function that creates Amazon S3 service client module.

export const bucketParams = { Bucket: "BUCKET_NAME", Key: "KEY" };

export const run = async () => {
  try {
    const data = await s3Client.send(new DeleteObjectCommand(bucketParams));
    console.log("Success. Object deleted.", data);
    return data; // For unit tests.
  } catch (err) {
    console.log("Error", err);
  }
};
run();
```

------