2017-08-05 4 views
0

ich einen Chat-Server mit Schienen aufgebaut habe, socket.io und Knoten, die Benutzer Bilder zueinander senden kann, die ich versuche zu bekommen mit Amazon S3 zu arbeiten. Hier ist der entsprechende Code-Schnipsel aus dem Client und den Server:S3 uploads beschädigte Datei, wenn Strom mit

Auftraggeber:

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

Server:

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

Jedes Mal, wenn ich versuche, ein Bild mit diesem Code zu laden, scheint es, zu arbeiten, Aber wenn ich meinen s3-Bucket überprüfe und das Image öffne, sagt mein Betriebssystem, dass die Datei nicht lesbar oder beschädigt ist. Ich habe versucht, den ContentLength-Parameter zu verwenden, aber wenn ich das verwende, erhalte ich den Fehler "BadDigest: Der Content-MD5, den Sie angegeben haben, stimmt nicht mit dem überein, was wir erhalten haben."

Kann mir jemand helfen? Ich habe diesen Code zu arbeiten, richtig ohne s3, aber aus irgendeinem Grunde, den ich korrupt oder unkenntlich Dateien erhalten, da ich begann es zu benutzen.

Antwort

0

ich herausgefunden, was falsch war. Sie benötigen einen binären Puffer verwenden, um die Daten zu übergeben, anstatt nur das Bestehen der Zeichenfolge bis s3 wie es ist, so dass diese im Grunde genommen für die s3 Parameter verwenden:

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

durch den Puffer verwendet wird, sollte es die Dateien richtig hochgeladen werden.