2015-05-26 8 views
9

Ich benutze busboy, meine hochgeladene Datei in einen Puffer schreiben und eine Überprüfung darauf (Breite, Höhe und Dateigröße). Ich kann nicht für das Leben von mir herausfinden, wie man den Strom abbricht/stoppt, sobald ich etwas mit dem Hochladen falsch finde.Knoten Busboy Abbrechen Hochladen

Zum Beispiel, wenn ich eine maximale Dateigröße von 500kb habe, die ich zulassen möchte, verfolge ich die Größe des Puffers beim Hochladen und möchte abbrechen, wenn die Größe über 500kb ist.

Hier ist eine vereinfachte Version meines Codes.

var self = this; 
var busboy = new Busboy({ 
    headers: self.req.headers, 
    limits: { 
     files: 1 
    } 
}); 
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 

    file.fileRead = []; 
    var size = 0; 
    file.on('data', function(chunk) { 

     size += chunk.length; 

     /* DO VALIDATION HERE */ 
     if(size > 500000) { 
      /*** ABORT HERE ***/ 
     } 


     file.fileRead.push(chunk); 
    }); 

    file.on('end', function() { 
     var data = Buffer.concat(file.fileRead, size); 
     // ... upload to S3 
    }); 

    self.req.pipe(busboy); 
}); 
+0

Sie können die Dateigröße begrenzen als ein Parameter busyboy - es ist nur eine 'fileSize' Eigenschaft ... –

+0

Was passiert, wenn ich Möchten Sie die Breite und Höhe der Datei überprüfen? Ich müsste den Stream dann abbrechen, anstatt auf das Limit-Ereignis zu zählen. – imns

+0

Ich habe einen Post über dieses _Somewhere_ in meinem angenommenen Kopfgeld, aber es benutzt nicht Busbuy. –

Antwort

0

Ich würde so etwas wie dies versuchen:

var self = this; 
var busboy = new Busboy({ 
    headers: self.req.headers, 
    limits: { 
     files: 1, 
     fileSize: 500000 
    } 
}); 
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 

    file.fileRead = []; 

    file.on('limit', function() { 
     //Clear variables 
    }); 

    file.on('data', function(chunk) { 
     file.fileRead.push(chunk); 
    }); 

    file.on('end', function() { 
     var data = Buffer.concat(file.fileRead, size); 
     // ... upload to S3 
    }); 

    self.req.pipe(busboy); 
}); 

Im Grunde habe ich eine neue Grenze in der Konfiguration von Busboy hinzugefügt: fileSize: 500 * 1024

Und ich begann Endschalterereignis hören:

file.on('limit', function() { 
     //Clear vars 
    }); 
+0

Ich bin nicht sicher, dass dies für mich sinnvoll ist. Welche Variablen würde ich im Limit klären und warum/wie würde das den Stream stoppen? Die Idee ist, dass ich keine 5gig-Datei parsen will, wenn ich nach 200kb weiß, dass es der falsche Dateityp oder die falsche Größe ist. – imns

+0

Ich sollte auch sagen, dass ich andere Validierung, wie die Breite und Höhe der Datei. – imns

+1

Zum Abbrechen der Kommunikation kann verwendet werden: 'file.resume();' nach: https://github.com/mscdex/busboy/issues/22, https://github.com/mscdex/busboy/pull/ 23 & https://github.com/mscdex/busboy#busboy-special-events (at note) –

0

Die Antwort ist einfach.

// do the required validation like size check etc. 
if(size > 500000) 
{ 
    self.req.unpipe(); 
    return; 
} 

Der Zusammenhang ist dies. Ich sehe in Busboy-Code, dass Busboy als WritableStream implementiert ist und darunter verwendet Dicer Modul zum Parsen, die auch als WritableStream implementiert ist. Flow ist wie folgt:

req stream ==> busboy ==> dicer ==> dicer löst ereignisse ==> busboy löst ereignisse in der datei ==> diese ereignisse werden in ihrem code verbraucht.

Um diesen ganzen Codefluss zu stoppen - sollte der obige Unpipe tun.

0

Ich würde denken, die richtige Sache zu schließen war, um zu tun, nur die Fassung und die Anforderung beenden

busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 

    file.fileRead = []; 
    var size = 0; 
    file.on('data', function(chunk) { 

     size += chunk.length; 

     /* DO VALIDATION HERE */ 
     if(size > 500000) { 

      self.req.socket.end(); 
      self.res.end(); 

     } 


     file.fileRead.push(chunk); 
    }); 

    file.on('end', function() { 
     var data = Buffer.concat(file.fileRead, size); 
     // ... upload to S3 
    }); 

    self.req.pipe(busboy); 
}); 
-1

konnte ich die zugrunde liegenden Dicer Parser für den Zugriff auf die eine ignore Methode hat das Hochladen die Datei im Wesentlichen beendet.

Hier ist, wie ich es tat: busboy._parser.parser._ignore()

Es ist sehr hackish scheint, aber es funktioniert und tut genau das, was ich wollte.

+0

Funktionen, die mit einem Unterstrich beginnen, signalisieren normalerweise private Methoden, auf die von außerhalb der Bibliothek nicht zugegriffen werden sollte. Ich würde sehr dagegen raten. – Max

5

Ok, so hatte ich das gleiche Problem, und ich löste es mit file.resume();

var fstream; 
req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { 

    // Validate file mimetype 
    if(mimetype != 'image/png'){ 
     file.resume(); 
     return res.json({ 
      success: false, 
      message: 'Invalid file format' 
     }); 
    } 

    // Upload 
    fstream = fs.createWriteStream(__dirname + '/tmp/' + timestamp + filename); 
    file.pipe(fstream); 
    fstream.on('close', function() { 
     return res.json({ 
      success: true 
     }); 
    }); 

}); 

req.pipe(req.busboy); 
Verwandte Themen