使用适用于 Java 的 Amazon SDK 在单个操作中上传档案 - Amazon Glacier
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

此页面仅适用于使用文件库和 2012 年原始 REST API 的 Amazon Glacier 服务的现有客户。

如果您正在寻找归档存储解决方案,建议使用 Amazon S3 中的 Amazon Glacier 存储类别 S3 Glacier Instant Retrieval、S3 Glacier Flexible Retrieval 和 S3 Glacier Deep Archive。要了解有关这些存储选项的更多信息,请参阅 Amazon Glacier 存储类别

从 2025 年 12 月 15 日起,Amazon Glacier(最初基于独立文件库的服务)将不再接受新客户,对现有客户不存在任何影响。Amazon Glacier 是一项独立服务,拥有自己的 API,可将数据存储在文件库中,与 Amazon S3 和 Amazon S3 Glacier 存储类别不同。在 Amazon Glacier 中,您现有的数据将确保安全,并且可以无限期地访问。无需进行迁移。对于低成本、长期的存档存储,Amazon 建议使用 Amazon S3 Glacier 存储类别,该类别可通过基于 S3 存储桶的 API、完全的 Amazon Web Services 区域可用性、更低的成本和 Amazon 服务集成,提供卓越的客户体验。如果您希望加强功能,可以考虑使用我们的 Amazon 将数据从 Amazon Glacier 文件库传输到 Amazon S3 Glacier 存储类别的解决方案指南,迁移到 Amazon S3 Glacier 存储类别。

使用适用于 Java 的 Amazon SDK 在单个操作中上传档案

适用于 Java 的 Amazon SDK 提供的高级和低级 API 都提供了上传档案的方法。

使用适用于 Java 的 Amazon SDK 高级 API 上传档案

该高级 API 的 ArchiveTransferManager 类提供了您可以用来将档案上传到文件库的 upload 方法。

注意

您可以使用 upload 方法上传小型或大型档案。根据您要上传的档案大小,此方法会确定是在单个操作中上传档案,还是使用分段上传 API 分段上传档案。

示例:使用适用于 Java 的 Amazon SDK 高级 API 上传档案

以下 Java 代码示例将档案上传到美国西部(俄勒冈州)区域(us-west-2)中的文件库(examplevault)。有关受支持 Amazon 区域和端点的列表,请参阅访问 Amazon Glacier

有关如何运行以下示例的分步说明,请参阅使用 Eclipse 运行 Amazon Glacier 的 Java 示例。您需要更新目标上传文件库名称和待上传文件名称旁显示的代码。

import java.io.File; import java.io.IOException; import java.util.Date; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.glacier.AmazonGlacierClient; import com.amazonaws.services.glacier.transfer.ArchiveTransferManager; import com.amazonaws.services.glacier.transfer.UploadResult; public class ArchiveUploadHighLevel { public static String vaultName = "*** provide vault name ***"; public static String archiveToUpload = "*** provide name of file to upload ***"; public static AmazonGlacierClient client; public static void main(String[] args) throws IOException { ProfileCredentialsProvider credentials = new ProfileCredentialsProvider(); client = new AmazonGlacierClient(credentials); client.setEndpoint("https://glacier.us-west-2.amazonaws.com/"); try { ArchiveTransferManager atm = new ArchiveTransferManager(client, credentials); UploadResult result = atm.upload(vaultName, "my archive " + (new Date()), new File(archiveToUpload)); System.out.println("Archive ID: " + result.getArchiveId()); } catch (Exception e) { System.err.println(e); } } }

使用适用于 Java 的 Amazon SDK 低级 API 在单个操作中上传档案

该低级 API 为所有归档操作提供了方法。下面是使用适用于 Java 的 Amazon SDK 上传档案的步骤。

  1. 创建 AmazonGlacierClient 类(客户端)的实例。

    您需要指定要上传档案的 Amazon 区域。您使用此客户端执行的所有操作都会应用到该 Amazon 区域。

  2. 通过创建一个 UploadArchiveRequest 类的实例提供请求信息。

    除了您要上传的数据以外,您还需要提供有效载荷的校验和(SHA-256 树形哈希)、文件库名称、数据的内容长度和您的账户 ID。

    如果您不提供账户 ID,则系统会使用与您提供来对请求签名的证书相关联的账户 ID。有关更多信息,请参阅将适用于 Java 的 Amazon SDK 与 Amazon Glacier 结合使用

  3. 以参数形式提供请求对象,运行 uploadArchive 方法。

    作为响应,Amazon Glacier(Amazon Glacier)返回新上传的档案的档案 ID。

以下 Java 代码段说明了前面的步骤。

AmazonGlacierClient client; UploadArchiveRequest request = new UploadArchiveRequest() .withVaultName("*** provide vault name ***") .withChecksum(checksum) .withBody(new ByteArrayInputStream(body)) .withContentLength((long)body.length); UploadArchiveResult uploadArchiveResult = client.uploadArchive(request); System.out.println("Location (includes ArchiveID): " + uploadArchiveResult.getLocation());

示例:使用适用于 Java 的 Amazon SDK 低级 API 在单个操作中上传档案

以下 Java 代码示例使用适用于 Java 的 Amazon SDK 将档案上传到文件库(examplevault)。有关如何运行以下示例的分步说明,请参阅使用 Eclipse 运行 Amazon Glacier 的 Java 示例。您需要更新目标上传文件库名称和待上传文件名称旁显示的代码。

import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.glacier.AmazonGlacierClient; import com.amazonaws.services.glacier.TreeHashGenerator; import com.amazonaws.services.glacier.model.UploadArchiveRequest; import com.amazonaws.services.glacier.model.UploadArchiveResult; public class ArchiveUploadLowLevel { public static String vaultName = "*** provide vault name ****"; public static String archiveFilePath = "*** provide to file upload ****"; public static AmazonGlacierClient client; public static void main(String[] args) throws IOException { ProfileCredentialsProvider credentials = new ProfileCredentialsProvider(); client = new AmazonGlacierClient(credentials); client.setEndpoint("https://glacier.us-east-1.amazonaws.com/"); try { // First open file and read. File file = new File(archiveFilePath); InputStream is = new FileInputStream(file); byte[] body = new byte[(int) file.length()]; is.read(body); // Send request. UploadArchiveRequest request = new UploadArchiveRequest() .withVaultName(vaultName) .withChecksum(TreeHashGenerator.calculateTreeHash(new File(archiveFilePath))) .withBody(new ByteArrayInputStream(body)) .withContentLength((long)body.length); UploadArchiveResult uploadArchiveResult = client.uploadArchive(request); System.out.println("ArchiveID: " + uploadArchiveResult.getArchiveId()); } catch (Exception e) { System.err.println("Archive not uploaded."); System.err.println(e); } } }