我试图建立一个允许用户从NodeJS支持的网站直接上传文件到我的Amazon S3存储桶的文件。它似乎是唯一的教程,除了the actual amazon docs for this都非常过时。亚马逊S3 POST API,并使用NodeJS签署策略
我一直在关注this tutorial,对于基本信息,但它又是过时的。它没有正确调用crypto
的方法,因为它试图将原始JavaScript对象传递给update
方法,该方法由于不是字符串或缓冲区而引发错误。
我也一直在寻找来源the knox npm package。它没有内置POST支持 - 我完全理解,因为它是一旦浏览器拥有正确的字段,就会执行POST。诺克斯似乎有正确的代码来签署一项政策,并且我试图让我的代码在此基础上工作......但再次无济于事。
这是我想出的代码。它产生一个base64编码策略,并创建一个签名......但是当我尝试进行文件上传时,它是根据Amazon的错误签名。
var crypto = require("crypto");
var config = require("../../amazonConfig.json");
exports.createS3Policy = function(callback) {
var date = new Date();
var s3Policy = {
"expiration": "2014-12-01T12:00:00.000Z",
"conditions": [
{"acl": "public-read"},
["content-length-range", 0, 2147483648],
{"bucket": "signalleaf"},
["starts-with", "$Cache-Control", ""],
["starts-with", "$Content-Type", ""],
["starts-with", "$Content-Disposition", ""],
["starts-with", "$Content-Encoding", ""],
["starts-with", "$Expires", ""],
["starts-with", "$key", "/myfolder/"],
{"success_action_redirect": "http://example.com/uploadsuccess"},
]
};
var stringPolicy = JSON.stringify(s3Policy).toString("utf-8");
var buffer = Buffer(stringPolicy, "utf-8");
var encoded = buffer.toString("base64");
var signature = crypto.createHmac("sha1", config.secretKey)
.update(new Buffer(stringPolicy, "utf-8")).digest("base64");
var s3Credentials = {
s3PolicyBase64: encoded,
s3Signature: signature
};
GLOBAL.s3creds = s3Credentials;
callback(s3Credentials);
};
我明显做错了,在这里。但我不知道是什么。任何人都可以帮助确定我做错了什么?我的问题在哪里? 有没有人有关于如何生成适当的Amazon S3策略的工作教程,其中包含来自NodeJS v0.10.x的签名,用于POST s3 REST API?
直接上传文件至S3是不是一个真正的简单的任务,特别是如果你想支持分块,自动恢复,用户的元数据,等等,等等政策的东西_can_相当复杂。考虑使用我维护的库:[Fine Uploader](http://fineuploader.com)。它支持在所有浏览器上直接上传到S3,甚至IE7。分块和自动恢复等功能也受支持。此外,我自己写了一个[node.js服务器端示例](http://bit.ly/1do27a0),与Fine Uploader S3配对时,将为您处理所有签名。 –
你能发表该评论作为答案吗?我可能会最终使用你的图书馆。仍然在评估它是如何工作的,等等。 –
我不确定那会很好。坦率地说,这可能被认为是一个糟糕的或仅仅是连接的答案。我的理解是,社区正在寻找包含代码的详细答案,而我的不符合该说明,这就是为什么我将其作为评论发布的原因。如果您对Fine Uploader有任何疑问,可以查看SO上的fine-uploader标签,在那里我们处理图书馆的支持问题。 –