gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:08:08 27 4
gpt4 key购买 nike

我正在尝试将文件上传到我的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com