Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript S3在使用流时上载损坏的文件_Javascript_Node.js_Amazon S3_Socket.io - Fatal编程技术网

Javascript S3在使用流时上载损坏的文件

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

我已经使用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('.');
    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() { });