浏览器直接上传到s3,准系统Node.js

时间:2014-12-02 06:07:44

标签: node.js amazon-s3 aws-sdk

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

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

对我来说,aws-sdk软件包比它帮助的更多。可疑的s3upload脚本是另一个问题。

如何在没有所有瑕疵的情况下直接上传到s3?

2 个答案:

答案 0 :(得分: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脚本,为上面的POLICYSIGNATURE生成值,下面是encodedPolicysignature变量。请记住,两个值都必须是base64编码:

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]

答案 1 :(得分:1)

您可以使用minio-js

中显示的example执行此操作

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

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

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