繁体   English   中英

使用流时,S3上传损坏的文件

[英]S3 uploads corrupt file when using stream

我使用rails,socket.io和节点构建了一个聊天服务器,该服务器允许用户彼此发送图像,而我正尝试将其与Amazon s3一起使用。 以下是客户端和服务器上的相关代码段:

客户:

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);

服务器:

socket.on('message', function(message) {
    console.log(message.type + " message received, sending to appropriate person: " + message.to);
    if (message.type == 'text') {
        //send message like normal
        sendMessage(message);           
    }
    else {
        //it's an image, need additional processing

        var blank_file = uuid.v4() + '-' + new Date().getTime() + '.' + message.extension;
        var contents = message.content;

        s3.putObject({
            Bucket: 'bucket-name', //not the real bucket name
            Key: blank_file,
            ContentType: 'image/' + message.extension,
            //ContentLength: message.size,
            Body: contents
        },
        function(err, data) {
            if (err) {
                console.log(err)
            }
            else {
                console.log('file uploaded to s3 successfully');

                message.content = getS3Url(blank_file);

                sendMessage(message);
            }
        })
    }
}

每当我尝试使用此代码上传图像时,它似乎都可以正常工作,但是当我检查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() { });

通过使用缓冲区,它应该正确上传文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM