【问题标题】:S3 direct bucket upload: success but file not thereS3直接存储桶上传:成功但文件不存在
【发布时间】:2015-08-24 19:34:04
【问题描述】:

我正在使用分段表单上传和签名策略(使用 AWS 签名版本 2)将文件直接上传到 S3 存储桶,如 herehere 所述。

上传成功(我被重定向到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);
    

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 2017-11-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 2018-04-12
      • 1970-01-01
      • 2017-09-17
      相关资源
      最近更新 更多