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

删除单个对象

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

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

有关 Amazon S3 特征和定价的信息,请参阅 Amazon S3 定价

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

警告

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

删除已启用或暂停版本控制的对象
注意

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

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

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

  3. 选择对象,然后选择删除

  4. 要确认删除指定的对象下的对象列表,请在删除对象?文本框中输入 delete

永久删除已启用版本控制的桶中的特定对象版本
警告

当您永久删除 Amazon S3 中的特定对象版本时,删除操作无法撤销。

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

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

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

  4. 选择显示版本开关。

  5. 选择对象版本,然后选择删除

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

永久删除启用版本控制的 Amazon S3 存储桶中的对象
警告

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

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

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

  3. 选择对象,然后选择删除

  4. 要确认永久删除指定的对象下列出的对象,请在删除对象?文本框中输入 permanently delete

注意

如果您在删除对象时遇到任何问题,请参阅我想永久删除受版本控制的对象

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

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

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

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

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

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

有关 S3 版本控制的更多信息,请参阅使用 S3 版本控制保留对象的多个版本

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

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

有关创建和测试有效示例的说明,请参阅《Amazon SDK for 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。您仅指定了对象键。

有关设置和运行代码示例的信息,请参阅《适用于 .NET 的 Amazon SDK 开发人员指南》中的适用于 .NET 的 Amazon SDK 入门

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

有关设置和运行代码示例的信息,请参阅《适用于 .NET 的 Amazon SDK 开发人员指南》中的适用于 .NET 的 Amazon SDK 入门

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

有关适用于 Ruby 的 Amazon 开发工具包 API 的更多信息,请转到适用于 Ruby 的 Amazon 开发工具包 – 版本 2

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