【问题标题】:S3 direct bucket upload: success but file not thereS3直接存储桶上传:成功但文件不存在
【发布时间】:2015-08-24 19:34:04
【问题描述】:
我正在使用分段表单上传和签名策略(使用 AWS 签名版本 2)将文件直接上传到 S3 存储桶,如 here 和 here 所述。
上传成功(我被重定向到success_action_redirect URL)但文件在存储桶中不可见,在它应该是的键下。虽然上传文件的ACL设置为public-read,但我认为可能是权限问题,但即使是bucket的所有者也看不到文件。
有人暗示可能是错的吗?
谢谢。
【问题讨论】:
标签:
amazon-web-services
file-upload
amazon-s3
【解决方案1】:
事实证明,我需要做的就是确保上传的文件名包含在正在上传到 S3 的 key 中。
如果你有这样的表格:
<form action="http://johnsmith.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
<input type="input" name="key" value="user/eric/" /><br />
(...)
</form>
然后文件将上传到user/eric。让我感到困惑的是,以这种方式定义的键是现有的 S3 文件夹。 AWS 让它看起来上传成功,但可能只是删除了上传的文件,因为密钥已经存在。解决方案是在密钥中包含文件名:
<form action="http://johnsmith.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
<input type="input" name="key" value="user/eric/${filename}" /><br />
(...)
</form>
另见Upload examples docs。
【解决方案2】:
每当我们使用预签名的 url 上传文件的小部分时,它都会将这些部分上传到 AWS 的临时位置。
成功上传文件的所有部分后,执行 CompleteMultipartUploadRequest,它将您的文件存储在 s3 存储桶中。
我希望它对你有用。
CompleteMultipartUploadResult multipartCompleteResult = null;
List<PartETag> partETags = new new ArrayList<>();
partETags.add(new new PartETag(partNumber1, eTag1));
partETags.add(new new PartETag(partNumber2, eTag2));
partETags.add(new new PartETag(partNumber3, eTag3));
CompleteMultipartUploadRequest multipartCompleteRequest =
new CompleteMultipartUploadRequest(getAmazonS3BucketName(), objectKey, uploadId, partETags);
multipartCompleteResult = getAmazonS3Client().completeMultipartUpload(multipartCompleteRequest);