【发布时间】:2012-04-23 10:03:12
【问题描述】:
我整晚都在使用 Amazon S3 预签名 URL 来尝试 PUT 文件。我在 java 代码中生成预签名的 URL。
AWSCredentials credentials = new BasicAWSCredentials( accessKey, secretKey );
client = new AmazonS3Client( credentials );
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest( bucketName, "myfilename", HttpMethod.PUT);
request.setExpiration( new Date( System.currentTimeMillis() + (120 * 60 * 1000) ));
return client.generatePresignedUrl( request ).toString();
然后我想使用生成的预签名 URL 来使用 curl 放置文件。
curl -v -H "content-type:image/jpg" -T mypicture.jpg https://mybucket.s3.amazonaws.com/myfilename?Expires=1334126943&AWSAccessKeyId=<accessKey>&Signature=<generatedSignature>
我认为,就像 GET 一样,这可以在不公开的存储桶上工作(这就是预签名的重点,对吗?)好吧,每次尝试我都拒绝访问。最后出于沮丧,我更改了存储桶的权限以允许每个人都写入。当然,然后预签名的 URL 起作用了。我迅速从存储桶中删除了 EVERYONE 权限。现在,我无权删除通过我自己的自预签名 URL 上传到我的存储桶中的项目。我see now 我可能应该在我上传的内容上放一个 x-amz-acl 标头。我怀疑在我做对之前我会创建更多不可删除的对象。
这引出了几个问题:
- 如何使用 PUT 和生成的预签名 URL 通过 curl 上传?
- 如何删除上传的文件和我创建的用于测试它的存储桶?
最终目标是手机将使用这个预签名的 URL 来 PUT 图像。我试图让它卷曲作为概念证明。
更新:我在amazon forums 上提出了一个问题。如果那里提供了答案,我会把它作为答案放在这里。
【问题讨论】:
-
亚马逊论坛一如既往地有帮助(意味着我的问题没有被窥视)所以我最终不得不通过上传到我的应用程序然后让我的应用程序使用 java api 发送来解决这个问题图像到 S3。
-
您是否有理由不使用预签名的 POST?也许他们会更好地工作,如果没有其他原因,他们可能已经在 SDK 中进行了更多的测试,等等。我当然能够使用亚马逊的 ruby gem 在预签名的帖子中设置内容类型。
-
他们的文档建议 PUT 作为放置内容的最佳方式。尽管如此,我确实花了一些时间试图让 POST 工作,但它也没有工作。同样,我认为问题在于正在设置的内容类型,也许它是 java SDK 特有的。一旦我得到了那里的内容(以任何方式),我的预签名 GET 工作得很好。我试过 SDK 1.3.3 和 1.3.6。我知道它们现在是 1.3.8,但发行说明没有表明与此问题相关的任何更改。
-
建议:切换到基于标头的签名以使用 curl 放置您的文件,如 stackoverflow.com/a/59295183/3784642 中所述