javascript - 如何使用 Meteor 上传文件到 Amazon S3?

标签 javascript amazon-web-services amazon-s3 meteor

我正在尝试将文件上传到我的 Amazon S3 存储桶。 S3 和 amazon 已设置。 这是来自亚马逊的错误消息:

Conflicting query string parameters: acl, policy

策略和签名被编码,Crypto.js for Node.js

var crypto=Npm.require("crypto");

我正在尝试使用 Meteor HTTP.post 方法构建 POST 请求。这也可能是错误的。

    var BucketName="mybucket";
    var AWSAccessKeyId="MY_ACCES_KEY";
    var AWSSecretKey="MY_SECRET_KEY";

    //create policy
    var POLICY_JSON={
        "expiration": "2009-01-01T00:00:00Z",
            "conditions": [ 
            {"bucket": BucketName}, 
            ["starts-with", "$key", "uploads/"],
            {"acl": 'public-read'},
            ["starts-with", "$Content-Type", ""],
            ["content-length-range", 0, 1048576],
        ]   
    }
    var policyBase64=encodePolicy(POLICY_JSON);
    //create signature
    var SIGNATURE = encodeSignature(policyBase64,AWSSecretKey);
    console.log('signature: ', SIGNATURE);

这是我在 Meteor 中使用的 POST 请求:

    //Send data----------
    var options={
        "params":{
            "key":file.name,
            'AWSAccessKeyId':AWSAccessKeyId,
            'acl':'public-read',
            'policy':policyBase64,
            'signature':SIGNATURE,
            'Content-Type':file.type,
            'file':file,
            "enctype":"multipart/form-data",
        }
    }

    HTTP.call('POST','https://'+BucketName+'.s3.amazonaws.com/',options,function(error,result){
        if(error){
            console.log("and HTTP ERROR:",error);
        }else{
            console.log("result:",result);
        }
    });

她正在对策略和签名进行编码:

encodePolicy=function(jsonPolicy){
    // stringify the policy, store it in a NodeJS Buffer object
    var buffer=new Buffer(JSON.stringify(jsonPolicy));
    // convert it to base64
    var policy=buffer.toString("base64");
    // replace "/" and "+" so that it is URL-safe.
    return policy.replace(/\//g,"_").replace(/\+/g,"-");
}

encodeSignature=function(policy,secret){
    var hmac=crypto.createHmac("sha256",secret);
    hmac.update(policy);
    return hmac.digest("hex");
}

A无法弄清楚发生了什么。 POST方法或加密可能已经存在问题,因为我不太了解这些方法。如果有人能给我指出正确的方向,编码或正确发送 POST 请求到 AmazonS3,它会很有帮助。
(我不喜欢使用 filepicker.io,因为我不想强制客户也在那里注册。)

提前致谢!!!

最佳答案

直接上传到 S3 你可以使用 slingshot包裹:

meteor add edgee:slingshot

在服务器端声明你的指令:

Slingshot.createDirective("myFileUploads", Slingshot.S3Storage, {
  bucket: "mybucket",
  allowedFileTypes: ["image/png", "image/jpeg", "image/gif"],

  acl: "public-read",

  authorize: function () {
    //You can add user restrictions here
    return true;
  },

  key: function (file) {
    return file.name;
  }
});

该指令将自动生成策略和签名。

他们只是像这样上传:

var uploader = new Slingshot.Upload("myFileUploads");

uploader.send(document.getElementById('input').files[0], function (error, url) {
  Meteor.users.update(Meteor.userId(), {$push: {"profile.files": url}});
});

关于javascript - 如何使用 Meteor 上传文件到 Amazon S3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19570496/

相关文章:

javascript - console.log 是否以不同方式对待 'this'?

hadoop - 具有 gzip 格式的大文本文件的 Spark 作业

android - 无法将推送通知提交到设备 token

amazon-web-services - S3 美国标准区域

r - 如何按 AWS 调用的字节顺序对列表进行排序

java - 如何在AWS lambda函数执行期间在AWS S3存储桶中写入文件?

amazon-web-services - 使用 tar.gz 文件作为 Amazon Athena 的源

php - 如何将 AJAX 结果传递回请求者页面

javascript - RequireJS 管理大型模块

javascript - 我可以将所有下划线对象绑定(bind)到 native JavaScript 原型(prototype)吗?