Javascript S3在使用流时上载损坏的文件
我已经使用rails、socket.io和node构建了一个聊天服务器,允许用户相互发送图像,我正在尝试使用AmazonS3。以下是来自客户端和服务器的相关代码片段: 客户:Javascript S3在使用流时上载损坏的文件,javascript,node.js,amazon-s3,socket.io,Javascript,Node.js,Amazon S3,Socket.io,我已经使用rails、socket.io和node构建了一个聊天服务器,允许用户相互发送图像,我正在尝试使用AmazonS3。以下是来自客户端和服务器的相关代码片段: 客户: var img_file = this.files[0]; //retrieved from file input file_reader.onload = function(e) { //console.log(img_file); var extension = img_file.name.split
var img_file = this.files[0]; //retrieved from file input
file_reader.onload = function(e) {
//console.log(img_file);
var extension = img_file.name.split('.');
extension = extension[extension.length-1];
get_user_id(username, function(to_id) {
socket.emit('message', {
from: "<%= @user.displayname %>",
fromid: <%= @user.id %>,
to: username,
toid: parseInt(to_id),
content: e.target.result,
type: 'image',
extension: extension,
size: img_file.size
});
})
};
file_reader.readAsBinaryString(img_file);
每当我尝试使用此代码上载图像时,它似乎都能工作,但当我检查s3存储桶并打开图像时,我的操作系统会说该文件不可读或已损坏。我曾尝试使用ContentLength参数,但使用该参数时出现错误“BadDigest:您指定的Content-MD5与我们收到的内容不匹配。”
有人能帮我吗?在没有s3的情况下,我让这段代码可以正常工作,但由于某种原因,自从我开始使用它以来,我一直得到损坏或无法识别的文件。我发现了问题所在。您需要使用二进制缓冲区将数据传递到s3,而不仅仅是按原样传递字符串,因此基本上对s3参数使用这些参数:
s3.putObject({
Bucket: 'bucket-name',
Key: file,
Body: new Buffer(contents, 'binary') //use a buffer to pass the data over
}, function() { });
通过使用缓冲区,它应该正确上传文件
s3.putObject({
Bucket: 'bucket-name',
Key: file,
Body: new Buffer(contents, 'binary') //use a buffer to pass the data over
}, function() { });