【问题标题】:Browser upload direct to s3, barebones Node.js浏览器直接上传到 s3,准系统 Node.js
【发布时间】:2016-01-23 15:08:06
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案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]

    【讨论】:

      【解决方案2】:

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

      在服务器上为 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 请求以上传对象。

      【讨论】:

        猜你喜欢
        • 2013-09-06
        • 2013-04-25
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 2015-01-25
        • 2016-01-15
        • 1970-01-01
        • 2014-11-14
        相关资源
        最近更新 更多