删除单个对象 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

删除单个对象

您可以使用 Amazon S3 控制台或 DELETE API 从 S3 存储桶中删除单个现有对象。

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

有关 Amazon S3 功能和定价的信息,请参阅 Amazon S3 定价

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

删除对象

  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. Bucket name 列表中,选择要从中删除对象的存储桶的名称。

  3. 要在版本控制为以下状态的情况下删除启用了版本控制的存储桶中的对象,请执行以下操作:

    • ,Amazon S3 将创建一个删除标记。要删除对象,请选择对象,然后选择 delete (删除),并通过在文本字段中键入 delete 确认您的选择。

    • ,Amazon S3 将永久删除对象版本。选择要删除的对象版本,然后选择 delete (删除),并通过在文本字段中键入 permanently delete 确认您的选择。

以下示例展示了如何使用 Amazon 开发工具包从存储桶中删除对象。有关更多信息,请参阅 Amazon Simple Storage Service API 参考中的 DELETE Object

如果已对存储桶启用 S3 版本控制,您将可使用以下选项:

  • 通过指定版本 ID 来删除特定对象版本。

  • 删除对象而不指定版本 ID,在这种情况下,Amazon S3 将向对象添加一个删除标记。

有关 S3 版本控制的更多信息,请参阅在 S3 存储桶中使用版本控制

Java

例 示例 1:删除对象(不受版本控制的存储桶)

以下示例假定存储桶不受版本控制且对象没有任何版本 ID。在删除请求中,您仅指定对象键而不是版本 ID。

有关创建和测试有效示例的说明,请参阅测试 Amazon S3 Java 代码示例

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.DeleteObjectRequest; import java.io.IOException; public class DeleteObjectNonVersionedBucket { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String keyName = "*** Key name ****"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); s3Client.deleteObject(new DeleteObjectRequest(bucketName, keyName)); } 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(); } } }

例 示例 2:删除对象(受版本控制的存储桶)

以下示例将删除受版本控制的存储桶中的对象。该示例通过指定对象键名和版本 ID 来删除特定对象版本。

本示例执行以下操作:

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

  2. 通过指定对象键名和版本 ID 来删除对象版本。如果对象没有其他版本,则 Amazon S3 将完全删除对象。否则,Amazon S3 仅删除指定版本。

    注意

    可以通过发送 ListVersions 请求来获取对象的版本 ID。

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.BucketVersioningConfiguration; import com.amazonaws.services.s3.model.DeleteVersionRequest; import com.amazonaws.services.s3.model.PutObjectResult; import java.io.IOException; public class DeleteObjectVersionEnabledBucket { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String keyName = "*** Key name ****"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Check to ensure that the bucket is versioning-enabled. String bucketVersionStatus = s3Client.getBucketVersioningConfiguration(bucketName).getStatus(); if (!bucketVersionStatus.equals(BucketVersioningConfiguration.ENABLED)) { System.out.printf("Bucket %s is not versioning-enabled.", bucketName); } else { // Add an object. PutObjectResult putResult = s3Client.putObject(bucketName, keyName, "Sample content for deletion example."); System.out.printf("Object %s added to bucket %s\n", keyName, bucketName); // Delete the version of the object that we just created. System.out.println("Deleting versioned object " + keyName); s3Client.deleteVersion(new DeleteVersionRequest(bucketName, keyName, putResult.getVersionId())); System.out.printf("Object %s, version %s deleted\n", keyName, putResult.getVersionId()); } } 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

以下示例演示如何删除受版本控制和不受版本控制的存储桶中的对象。有关 S3 版本控制的更多信息,请参阅在 S3 存储桶中使用版本控制

例 删除不受版本控制的存储桶中的对象

以下 C# 示例将删除不受版本控制的存储桶中的对象。该示例假定对象没有版本 ID,因此您未指定版本 ID。您仅指定了对象键。

有关如何创建和测试有效示例的信息,请参阅 运行 Amazon S3 .NET 代码示例

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); } } } }

例 删除受版本控制的存储桶中的对象

以下 C# 示例将删除受版本控制的存储桶中的对象。它将通过指定对象键名和版本 ID 来删除对象的特定版本。

代码将执行以下任务:

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

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

  3. 通过指定对象键名和版本 ID 来删除示例对象。

    注意

    还可以通过发送 ListVersions 请求来获取对象的版本 ID。

    var listResponse = client.ListVersions(new ListVersionsRequest { BucketName = bucketName, Prefix = keyName });

有关如何创建和测试有效示例的信息,请参阅 运行 Amazon S3 .NET 代码示例

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 版 Amazon SDK for PHP 中的类删除不受版本控制的存储桶中的对象。有关从受版本控制的存储桶中删除对象的信息,请参阅使用 REST API

此示例假定您已按照 使用Amazon SDK for PHP和运行 PHP 示例 中的说明执行操作,并正确安装了 Amazon SDK for PHP。有关运行本指南中的 PHP 示例的信息,请参阅 运行 PHP 示例

下面的 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()); }

要为每个请求删除一个对象,请使用 DELETE API。有关更多信息,请参阅 DELETE Object。有关使用 CLI 删除对象的更多信息,请参阅 delete-object

您可以使用 Amazon 开发工具包删除对象。然而,如果您的应用程序需要它,则可以直接发送 REST 请求。有关更多信息,请参阅 Amazon Simple Storage Service API 参考中的 DELETE Object