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>

另见 Upload examples docs

每当我们使用预签名 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);