我已经深入了解了有关该主题的几乎所有资源,但仍然需要您的帮助才能完成这项工作。我想直接从 Meteor 应用程序中的浏览器直接将文件上传到我的 S3。为此,我向客户端提供了一个签名的 url,就像在这个简化的示例中一样:
Meteor.methods({
requestUpload: function(filename) {
var fut = new Future();
new Fiber(function() {
var params = {
Bucket: MY_BUCKET,
Key: new Date().getTime() + "_" + filename
};
var surl = s3.getSignedUrl('putObject', params, function(err, surl) {
if (!err) {
console.log("signed url: " + surl);
fut.return(data);
} else {
console.log("Error signing url " + err);
fut.return();
}
});
}).run();
return fut.wait();
}
}
客户端然后调用这个方法,得到签名的 url,看起来像这样
https://mybucket.s3-eu-west-1.amazonaws.com/1382890365957_myfile.png?AWSAccessKeyId=AKBLABLA&Expires=1382891265&Signature=BLABLA
并尝试使用 jQuery 使用 POST 请求上传文件,如下所示:
Template.form.events({
'submit form': function(e, t) {
e.preventDefault();
var fileInput = t.find("input[type=file]");
for (var i = 0; i < fileInput.files.length; i++) {
var file = fileInput.files[i];
Meteor.call("requestUpload", file.name, function(err, surl) {
if (!err) {
console.log("signed url: " + surl);
var reader = new FileReader();
reader.onload = function(event) {
// Here I am trying to upload, it fails
$.post(surl, reader.result, function(data, status) {
console.log("status: " + status);
console.log("data: " + data);
});
};
reader.readAsDataURL(file);
} else {
console.log(err);
}
});
}
}
});
我想使用 jQuery,因为我认为它可能是涵盖许多浏览器和浏览器版本的好方法。我还检查了这个特定存储桶的 CORS 配置,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我在服务器上配置我的 SDK 的凭据确保没问题,它们具有管理员权限,我一直在使用它们从服务器在 S3 中放置和获取对象。此外,如果我为私有文件上的 GET 调用签名 url,则签名的 url 是有效的。我可能在发帖时做错了什么。
非常感谢任何帮助!