如何使用流星将图像从FileReader上传到Amazon S3
我正试图用流星向亚马逊S3构建一个图像上传器。 感谢Hubert OG,Ive发现了使事情变得简单的AWS-SDK。
我的问题是,上传的数据似乎是腐败的。 它说,当我下载文件时,该文件可能已损坏。 可能是。
将数据插入图像src中,确实有效,并且图像的预览显示为原样,所以原始文件和数据可能是正确的。
我使用FileReader加载文件,并将结果数据传递给AWS-SDK putObject方法。
var file=template.find('[type=file]').files[0];
var key="uploads/"+file.name;
var reader=new FileReader();
reader.onload=function(event){
var data=event.target.result;
template.find('img').src=data;
Meteor.call("upload_to_s3",file,"uploads",reader.result);
};
reader.readAsDataURL(file);
这是服务器上的方法:
"upload_to_s3":function(file,folder,data){
s3 = new AWS.S3({endpoint:ep});
s3.putObject(
{
Bucket: "myportfoliositebucket",
ACL:'public-read',
Key: folder+"/"+file.name,
ContentType: file.type,
Body:data
},
function(err, data) {
if(err){
console.log('upload error:',err);
}else{
console.log('upload was succesfull',data);
}
}
);
}
我将一个npm模块作为一个智能软件包包装在这里:https://atmosphere.meteor.com/package/s3policies
有了它,您可以制作一个返回写入策略的流星方法,并且可以使用ajax调用将该策略上传到S3。
例:
Meteor.call('s3Upload', name, function (error, policy) {
if(error)
onFinished({error: error});
var formData = new FormData();
formData.append("AWSAccessKeyId", policy.s3Key);
formData.append("policy", policy.s3PolicyBase64);
formData.append("signature", policy.s3Signature);
formData.append("key", policy.key);
formData.append("Content-Type", policy.mimeType);
formData.append("acl", "private");
formData.append("file", file);
$.ajax({
url: 'https://s3.amazonaws.com/' + policy.bucket + '/',
type: 'POST',
xhr: function() { // custom xhr
var myXhr = $.ajaxSettings.xhr();
if(myXhr.upload){ // check if upload property exists
myXhr.upload.addEventListener('progress',
function (e){
if(e.lengthComputable)
onProgressUpdate(e.loaded / e.total * 100);
}, false); // for handling the progress of the upload
}
return myXhr;
},
success: function () {
// file finished uploading
},
error: function () { onFinished({error: arguments[1]}); },
processData: false,
contentType: false,
// Form data
data: formData,
cache: false,
xhrFields: { withCredentials: true },
dataType: 'xml'
});
});
编辑:
该行中的“文件”变量: formData.append("file", file);
是从类似于这样的一行: var file = document.getElementById('fileUpload').files[0];
服务器端代码如下所示:
Meteor.methods({
s3Upload: function (name) {
var myS3 = new s3Policies('my key', 'my secret key');
var location = Meteor.userId() + '/' + moment().format('MMM DD YYYY').replace(/s+/g, '_') + '/' + name;
if(Meteor.userId()) {
var bucket = 'my bucket';
var policy = myS3.writePolicy(location, bucket, 10, 4096);
policy.key = location;
policy.bucket = bucket;
policy.mimeType = mime.lookup(name);
return policy;
}
}
});
正文应转换为缓冲区 - 请参阅文档。
因此,而不是Body: data
你应该有Body: new Buffer(data, 'binary')
。
上一篇: How to Upload images from FileReader to Amazon s3, using meteor
下一篇: Naive way to find largest block in a rectangle of 1's and 0's