Загрузите файл с помощью NodeJS и BusBoy

Я загружаю файл с помощью NodeJS. Мое требование - прочитать поток в переменную, чтобы я мог сохранить его в AWS SQS. Я не хочу хранить файл на диске. Это возможно? Мне нужен только загруженный файл в поток. Я использую код (upload.js):

var http = require('http');
var Busboy = require('busboy');

module.exports.UploadImage = function (req, res, next) {

    var busboy = new Busboy({ headers: req.headers });

    // Listen for event when Busboy finds a file to stream.
    busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {

        // We are streaming! Handle chunks
        file.on('data', function (data) {
                // Here we can act on the data chunks streamed.
        });

        // Completed streaming the file.
        file.on('end', function (stream) {
            //Here I need to get the stream to send to SQS
        });
    });

    // Listen for event when Busboy finds a non-file field.
    busboy.on('field', function (fieldname, val) {
            // Do something with non-file field.
    });

    // Listen for event when Busboy is finished parsing the form.
    busboy.on('finish', function () {
        res.statusCode = 200;
        res.end();
    });

    // Pipe the HTTP Request into Busboy.
    req.pipe(busboy);
};

Как мне получить загруженный поток?


person User2682    schedule 04.05.2017    source источник


Ответы (3)


В событии busboy 'file' вы получаете параметр с именем 'file', и это поток, поэтому вы можете передать его по конвейеру.

Например

busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { 
    file.pipe(streamToSQS)
}
person Whisnesky    schedule 29.07.2017

Надеюсь, это вам поможет.

busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
    var filename = "filename";
    s3Helper.pdfUploadToS3(file, filename);
  }
busboy.on('finish', function () {
        res.status(200).json({ 'message': "File uploaded successfully." });
    });
    req.pipe(busboy);
person Nilesh Patel    schedule 11.08.2017

В то время как текущий и существующий аргументы предполагают, что на самом деле можно просто отправить поток (файл) на что-то, что может принимать поток, фактические фрагменты получаются в реализованных вами методах обратного вызова файла.

Из документов: (https://www.npmjs.com/package/busboy)

file.on('data', function(data) {
   // data.length bytes seems to indicate a chunk
   console.log('File [' + fieldname + '] got ' + data.length + ' bytes');
});
      
   
file.on('end', function() {
  console.log('File [' + fieldname + '] Finished');
});


Обновлять:

Найдены документы конструктора, второй аргумент - читаемый поток.

file (‹строка> имя поля,‹ ReadableStream> поток, ‹строка> имя файла,‹ строка> transferEncoding, ‹строка> mimeType) - генерируется для каждого найденного нового поля формы файла. transferEncoding содержит значение Content-Transfer-Encoding для файлового потока. mimeType содержит значение Content-Type для файлового потока.

person JoshuaTree    schedule 22.10.2018