【问题标题】:S3 PUT gives 200 OK response but the file isn't always uploadedS3 PUT 给出 200 OK 响应,但文件并不总是上传
【发布时间】:2019-09-17 23:34:57
【问题描述】:

我正在尝试将文件上传到预签名的 S3 URL。这大约有一半的时间可以正常工作。但是,文件的另一半时间根本没有上传到 S3。

我正在使用以下 sn-p 来完成繁重的工作:

let preSignedUrl = result.Data.toString().replace(/amp;/gm, "");
let blob = b64toBlob(file.fileString, result.ContentType);

const resp = await axios.put(
    preSignedUrl,
    { data: blob },
    {
        headers: {
            "Content-Type": result.ContentType,
        },
    });

如果我通过 Postman 而不是浏览器上传,则始终没问题。

blob、URL 和内容类型都是正确的。我总是上传到同一个桶。我可以持续上传文件,删除它,然后重新上传同一个文件,它不会再上传第二次了。

总是从 S3 收到 200 OK 响应。

我的请求格式中是否遗漏了任何明显的内容?这种方法有什么“陷阱”吗? S3 是否可以在不实际接受文件的情况下返回 200?

我曾尝试寻找类似的问题,但没有任何运气。

【问题讨论】:

  • 您是否查看过实际的请求/响应,并将其与 Postmate 的进行比较?如果是这样,在您的问题中提供请求(当然,没有有效负载和密钥:))可能会有所帮助

标签: amazon-s3


【解决方案1】:

我想我已经找到了原因和解决方案;我只是误解了承诺的内容。

结果证明这是由我们正在处理的页面上的其他一些东西引起的。

我们拥有的完整文件上传代码是(最后使用 fetch 而不是 axios):

async function uploadFiles() {
  let requestArray = files.map(file => {
    return new Promise(resolve => {
      handleDocs.GenerateUrl(file.fileName, "{!OppName}", async (result, event) => {
        let preSignedUrl = result.Data.toString().replace(/amp;/gm, "");
        let blob = b64toBlob(file.fileString, result.ContentType);

        await fetch(preSignedUrl, {
          method: "PUT",
          body: blob,
          headers: {
            "Content-Type": result.ContentType,
          },
        });

        resolve();
      });
    });
  });

  await Promise.all(requestArray);
  document.location.reload();
}

我们拥有的部分功能是能够从 S3 中删除文档,这是通过调用我们编写的 API 来完成的。

作为我们测试的一部分,我们会上传一个文件,将其删除,然后重新上传,这就是我们会看到此问题的时候。

事实证明,document.location.reload(); 正在重新提交删除数据作为页面重新加载的一部分。将其更改为 window.location.href = window.location.href; 解决了我们遇到的问题。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2020-08-27
    • 2015-03-11
    • 2022-10-04
    • 1970-01-01
    相关资源
    最近更新 更多