2016-05-17 6 views
0

Ich habe diesen Code bisher, kann aber nicht die Buffer bianary bekommen.Wie hochzuladen Datei in node.js mit HTTP-Modul?

var http = require('http'); 
var myServer = http.createServer(function(request, response) 
{ 
    var data = ''; 

    request.on('data', function (chunk){ 
     data += chunk; 
    }); 

    request.on('end',function(){ 

     if(request.headers['content-type'] == 'image/jpg') { 

      var binary = Buffer.concat(data); 

      //some file handling would come here if binary would be OK 

      response.write(binary.size) 
      response.writeHead(201) 
      response.end() 
     } 

Aber diesen Fehler: throw new TypeError('Usage: Buffer.concat(list, [length])');

Antwort

1

Sie machen drei schlechte Dinge:

  1. die API falsch Puffer - daher die Fehlermeldung.
  2. Binärdaten als Strings verketten
  3. Buffering Daten im Speicher

Mukesh mit # 1, behandelt hat, so werde ich die tieferen Probleme abdecken.

Zuerst erhalten Sie binäre Buffer Chunks und konvertieren sie in Strings mit der Standardcodierung (utf8), dann verketten sie. Dies wird Ihre Daten beschädigen. Genauso wie dort existierende Bytefolgen, die nicht gültig sind utf8, werden diese Daten auch verloren gehen, wenn eine gültige Sequenz durch einen Chunk halbiert wird.

Stattdessen sollten Sie die Daten immer als Binärdaten speichern. Pflegen Sie ein Array von Buffer zu dem Sie jeden Chunk push, dann verketten Sie sie alle am Ende.

Dies führt zu dem Problem # 3. Sie puffern den gesamten Upload in den Speicher und schreiben ihn dann in eine Datei, anstatt ihn direkt in eine (temporäre) Datei zu streamen. Dies belastet Ihre Anwendung sehr, da sowohl Speicher belegt als auch Zeit für die Allokation verbraucht wird. Sie sollten einfach pipe die request zu einem Datei-Ausgabestream, dann überprüfen Sie es auf der Festplatte.

Wenn Sie nur sehr kleine Dateien akzeptieren, können Sie sie im Speicher behalten, aber Sie müssen sich vor Clients schützen, die zu viele Daten senden (und tatsächlich darüber lügen, wie viel sie senden werden).

+0

ausgezeichnete antwort :) –