2017-08-05 7 views
0

rails、socket.io、およびノー​​ドを使用してチャットサーバーを構築しました。これにより、ユーザーは互いにAmazon 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() { }); 

バッファを使用することにより、それが適切にファイルをアップロードする必要があります。

関連する問題