2017-08-05 47 views
0

我已经使用rails,socket.io和节点构建了一个聊天服务器,允许用户将图像发送给对方,我试图与亚马逊s3一起工作。下面是从客户端和服务器相关的代码片段: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,但由于某种原因,我开始使用它后不断收到损坏或无法识别的文件。

回答

0

我想通了什么是错的。您需要使用二进制缓冲区传递数据到S3,而不是仅仅传递字符串为是,所以基本上使用这些为S3参数:

s3.putObject({ 
    Bucket: 'bucket-name', 
    Key: file, 
    Body: new Buffer(contents, 'binary') //use a buffer to pass the data over 
}, function() { }); 

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