S3 直接存储桶上传:成功但文件不存在
S3 direct bucket upload: success but file not there
我正在使用分段表单上传和签名策略(使用 AWS 签名版本 2)将文件直接上传到 S3 存储桶,如 here and here 所述。
上传成功(我被重定向到 success_action_redirect URL)但是文件在存储桶中不可见,在密钥下它应该是。虽然上传文件的ACL设置为public-read
,我以为可能是权限问题,但即使是bucket的拥有者也看不到文件
有人提示可能是错误的吗?
谢谢。
事实证明,我需要做的就是确保上传的文件名包含在正在上传到 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>
每当我们使用预签名 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);
我正在使用分段表单上传和签名策略(使用 AWS 签名版本 2)将文件直接上传到 S3 存储桶,如 here and here 所述。
上传成功(我被重定向到 success_action_redirect URL)但是文件在存储桶中不可见,在密钥下它应该是。虽然上传文件的ACL设置为public-read
,我以为可能是权限问题,但即使是bucket的拥有者也看不到文件
有人提示可能是错误的吗?
谢谢。
事实证明,我需要做的就是确保上传的文件名包含在正在上传到 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>
每当我们使用预签名 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);