0

在 Heroku 上找到了一篇关于直接从浏览器上传到私有 s3 存储桶的文章:

https://devcenter.heroku.com/articles/s3-upload-node

对我来说,aws-sdk 包的作用远大于它的帮助。可疑的 s3upload 脚本是另一个问题。

一个人如何直接上传到 s3 而没有任何麻烦?

4

2 回答 2

1

不得不挖掘一个旧的基于 Java 的项目来解决这个问题。事实证明,一旦您了解了基本要素,它就会变得又好又简单。首先,设置一个快速的 HTML 表单来进行上传:

<form action="https://BUCKETNAME.s3.amazonaws.com/"
      method="post"
      enctype="multipart/form-data">
  <input type="hidden" name="key" value="KEY"></input>
  <input type="hidden" name="AWSAccessKeyId" value="ACCESS_KEY"></input>
  <input type="hidden" name="policy" value="POLICY"></input>
  <input type="hidden" name="signature" value="SIGNATURE"></input>
  <input type='file' name='file'>
  <input type='submit' value='Upload Driver Photo'>
</form>

接下来,编写一个快速的 Node.JS 脚本来生成上面的值,下面的和POLICY变量。请记住,两个值都必须经过 base64 编码:SIGNATUREencodedPolicysignature

var crypto=require("crypto"),
  bucketName="BUCKETNAME",
  secretKey="SECRET_KEY",
  s3Key="KEY",
  expiration= new Date();
expiration.setDate(expiration.getDate()+1);
var policy={
  expiration:expiration.toISOString(),
  conditions:[
    {bucket:bucketName},
    {key:s3Key}
  ]
},
  encodedPolicy=new Buffer(JSON.stringify(policy)).toString("base64"),
  signature=crypto.createHmac(
    "sha1", secretKey
  ).update(encodedPolicy).digest("base64");

将上面的 Node.JS 代码包装在一个 Promise 中以获得额外的美味。嵌入 Angular/REST、带有模板的 Express 或其他选择的中间件/表示框架。

请注意:上面的代码不限制上传文件的大小。这将在另一个条件下完成,即 50MB 限制:["content-length-range", 0, 52428800]

于 2014-12-02T06:07:44.460 回答
1

您可以使用minio-js执行此操作,如示例中所示

在服务器上获取 PUT 的预签名 url,如下所示:

var presignedUrl = s3Client.presignedPutObject('my-bucketname', 'my-objectname', 1000, function(e, presignedUrl) {
  if (e) return console.log(e)
  console.log(presignedUrl)
})

在浏览器上,使用它presignedUrl向 S3 发出简单的 PUT 请求以上传对象。

于 2016-01-23T07:08:06.960 回答