【问题标题】:Amazon S3 copy object Java APIAmazon S3 复制对象 Java API
【发布时间】:2017-01-11 23:31:40
【问题描述】:

我正在尝试将数据从一个 s3 文件夹复制到同一存储桶中的另一个文件夹。我正在使用 AmazonS3 类中的 copyObject 函数。我没有看到任何错误或异常,我也得到了结果。但是文件没有被复制。如果有任何失败,我至少会排除一些错误。我做错了什么? 我怎么知道实际的错误?

AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider()); CopyObjectRequest copyObjRequest = new CopyObjectRequest( sourceURI.getBucket()、sourceURI.getKey()、destinationURI.getBucket()、destinationURI.getKey());

CopyObjectResult copyResult = s3client.copyObject(copyObjRequest);

我在源和目标 URI 中有正确的值。是因为证件吗?如果由于缺少凭据而无法正常工作,我预计此代码会出错。

【问题讨论】:

  • 没有看到你的代码就无法判断。
  • 我也用代码更新了问题。
  • 你如何确定目标文件不存在?
  • 我可以在 S3 中找到那个文件夹是空的并且请求的文件没有被移动。
  • 这是来自 AWS 的 demo for java

标签: amazon-web-services amazon-s3


【解决方案1】:

我怀疑您错误地指定了副本的目的地。

目标是一个完整的存储桶和密钥,例如,如果您将dogs/beagle.png 复制到smalldogs/beagle.png,那么将目标密钥指定为smalldogs/ 是不够的。这就是副本在 NTFS 或 NFS 等常规文件系统上的工作方式,而不是它们在对象存储中的工作方式。这将产生一个名为 smalldogs/ 的对象,它看起来是一个文件夹,但它实际上是 beagle 图像的副本。

因此,删除您创建的错误对象,然后完全正确地指定目标。

注意这里的操作是复制。如果你想“移动”,那么你需要在之后删除源。

这里有一些基于你的代码,对我来说运行良好,并生成正确的复制文件:

String bkt = "my-bucket";
String src = "dogs/beagle.png";
String dst = "smalldogs/beagle.png";

AmazonS3Client s3 = new AmazonS3Client();
CopyObjectRequest req = new CopyObjectRequest(bkt, src, bkt, dst);
CopyObjectResult res = s3.copyObject(req);

【讨论】:

  • 我正在尝试打印源存储桶、源密钥、目标存储桶和目标密钥。源存储桶和目标存储桶值是我的存储桶名称。我的源代码是dogs/beagle.png。我的目标密钥是 smalldogs/,我尝试使用目标密钥作为 smalldogs/beagle.png。它也不会复制数据。并且没有错误。
  • 如果没有错误,那么它确实复制了对象,就像它第一次那样。要么你弄错了,要么新对象还没有完全传播并且你的列表没有返回它(因为 S3 在写入后最终有一致的列表)。
  • 即使等了2天,文件也没有出现。我之前也怀疑最终的一致性问题。问题是我只是创建了一个 ProfileCredentialsProvider 而其中没有任何值吗?
  • 如果提供给 API 的凭据不足以读取源或写入目标,那么您的 API 调用将失败并出现身份验证错误。该代码对我有用,目标文件几乎立即出现。您是否 100% 确定您正在寻找正确的东西?
猜你喜欢
  • 1970-01-01
  • 2013-05-29
  • 2012-06-17
  • 2016-11-05
  • 1970-01-01
  • 2018-10-14
  • 2014-04-16
  • 2011-01-17
  • 2018-09-20
相关资源
最近更新 更多