2015-05-26 15 views
9

Używam busboy, zapisuję mój załadowany plik do bufora i przeprowadzam na nim poprawkę (szerokość, wysokość i rozmiar pliku). Nie mogę do końca życia dowiedzieć się, jak przerwać/zatrzymać strumień, gdy coś znajdzie się nie tak z przesyłaniem.Węzeł Busboy Przerwij przesyłanie

Na przykład, jeśli mam maksymalny rozmiar pliku 500kb, na który chcę zezwolić, śledzę rozmiar bufora podczas jego przesyłania i chcę go przerwać, jeśli jego rozmiar przekracza 500 kB.

Oto uproszczona wersja mojego kodu.

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

Można ograniczyć rozmiar pliku jako parametr do busyboy - to tylko 'nieruchomość fileSize' ... –

+0

Co zrobić, jeśli chcesz sprawdzić poprawność szerokości i wysokości pliku? Musiałbym przerwać strumień, zamiast liczyć na zdarzenie 'limit'. – imns

+0

Mam post o tym miejscu w moich akceptowanych nagrodach, ale nie używa on busbuy. –

Odpowiedz

0

chciałbym spróbować czegoś takiego:

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

Zasadniczo Dodałem nowy limit w konfiguracji busboy: fileSize: 500 * 1024

I zacząłem słuchać granica wydarzenie:

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

Nie jestem pewien, czy to ma sens dla mnie. Jakie zmienne zostałyby usunięte w limicie i dlaczego/w jaki sposób to zatrzymałoby strumień? Pomysły to: nie chcę analizować pliku 5gig, jeśli wiem po 200kb, że jest to niewłaściwy typ pliku lub rozmiar. – imns

+0

Też powiem, że robię inne sprawdzanie, jak szerokość i wysokość pliku. – imns

+1

Aby przerwać połączenie można użyć: 'file.resume();' zgodnie z: https://github.com/mscdex/busboy/issues/22, https://github.com/mscdex/busboy/pull/ 23 & https://github.com/mscdex/busboy#busboy-special-events (notatka) –

0

Odpowiedź jest prosta.

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

Kontekst jest to. W teście busboya widzę, że busboy jest zaimplementowany jako WritableStream, a pod nim używa modułu Dicer do parsowania, który jest również implementowany jako WritableStream. Przepływ jest następujący:

req stream ==> busboy ==> dicer ==> dicer podnosi zdarzenia ==> busboy podnosi zdarzenia w pliku ==> te zdarzenia są zużywane w twoim kodzie.

Aby zatrzymać cały ten przepływ kodu - powyższe polecenie powinno wykonać.

0

Myślę właściwą rzeczą do zrobienia było po prostu zamknąć gniazdo i zakończyć żądania

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

udało mi się dostęp do podstawowych Dicer parser, który ma metodę ignore która zasadniczo zatrzymuje przesyłanie pliku.

Oto jak to zrobiłem: busboy._parser.parser._ignore()

Wydaje się bardzo hackish, ale działa i robi dokładnie to, co chciałem.

+0

Funkcje zaczynające się od podkreślenia zwykle sygnalizują prywatne metody, do których nie można uzyskać dostępu spoza biblioteki. Gorąco poleciłbym temu. – Max

5

Ok, więc miałem ten sam problem i rozwiązać go z 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); 
Powiązane problemy