【问题标题】:How do you upload a file to a pre-signed POST URL from a browser to Minio or S3 using javascript如何使用 javascript 将文件从浏览器上传到预先签名的 POST URL 到 Minio 或 S3
【发布时间】:2017-08-09 16:38:31
【问题描述】:

This article 展示了如何使用表单将文件上传到 Amazon S3 或 minio。我想使用预签名的 POST URL 策略方法,因为它似乎是最安全的。

但是,我希望使用浏览器以编程方式将文件上传到 minio 或 S3。换句话说,我想使用 javascript,而不是表单。

我是节点用户,熟悉superagent,使用.field().attach() 操作设置表单字段和上传文件非常简单。

这适用于节点:

  let cdnAgent = superagent;
  let req = cdnAgent.post(r.data.pictureSet.uploadLink);
  _.each(uploadForm, function(value, key) {
    req.field(key, value);
  });
  // upload file via the created signed policy
  return req
  .set('Content-Type', 'application/octet-stream')
  .attach('file', 'test/data/test.jpg');
}).then(r => {

但是,这在浏览器中不起作用,不支持 .attach(),当我解决这个问题时,我遇到了 CORS 问题,因为我的 javascript 域是与我的 minio 或 S3 域不同的域。

为了回答这个问题,我希望看到一个使用 XMLHttpRequest、Axios、superagent 或 Fetch 的完整示例,它可以跨域工作。

我注意到有一些与此类似的问题和一些答案,但它们似乎都已经过时并且技术已经发展。所以我不认为这是一个重复的问题。

【问题讨论】:

  • Buckets 支持custom CORS responses,因此您应该能够解决这部分问题。
  • CORS 在 minio 上默认开启,这是我测试的对象。但是感谢 Amazon CORS 链接,我可能会在某个时候需要它。
  • 抱歉,我脑子里装的是 S3,完全忽略了多次提到的 minio。
  • BTW Superagent 确实可以工作,但是如果您有任何错误,它只会提供一个非常令人困惑的 CORS 消息。线程在这里与底部的工作代码。 github.com/visionmedia/superagent/issues/1193

标签: amazon-s3 xmlhttprequest axios superagent minio


【解决方案1】:

https://github.com/harshavardhana/minio-js-browser-upload/ 你可以简单地克隆这个 repo 然后运行

node presign-post-server.js

访问浏览器http://localhost:8080。单击上传文件,只需上传选定的文件将通过预签名的发布策略样式上传。 [1]

目前该示例仅指向https://play.minio.io:9000uploads 存储桶。 [2]

[1]https://github.com/harshavardhana/minio-js-browser-upload/blob/master/index-post.html

[2]https://github.com/harshavardhana/minio-js-browser-upload/blob/master/presign-post-server.js

【讨论】:

  • 工作示例,喜欢它!现在只需将其打包到 docker 映像中即可:-)。但非常感谢,这是一个规范的 XMLHttpRequest 示例。 OP 中 cmets 中的 SuperAgent 答案。现在有人只需要发布 Axios 答案,下一个菜鸟会更好......
猜你喜欢
  • 2019-12-05
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多