Загрузка файла в Node JS - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь реализовать загрузочный маршрутизатор для приложения nodejs.После нескольких загрузок мое приложение вылетает.Любой совет?

app.route( "/download" )
.get( (req, res) => {
    var filename = req.query.filename;
    var file = __dirname + '/upload/' + filename;
    var mimetype = mime.lookup(file);

    res.setHeader('Content-disposition', 'attachment; filename=' + req.query.filename);
    res.setHeader('Content-type', mimetype);

    var filestream = fs.createReadStream(file);
    filestream.pipe(decrypt).pipe(res);

})

Я получаю эту ошибку:

    Error [ERR_STREAM_WRITE_AFTER_END]: write after end
at writeAfterEnd (_stream_writable.js:243:12)
at Decipher.Writable.write (_stream_writable.js:291:5)
at ReadStream.ondata (_stream_readable.js:666:20)
at ReadStream.emit (events.js:182:13)
at addChunk (_stream_readable.js:283:12)
at readableAddChunk (_stream_readable.js:264:11)
at ReadStream.Readable.push (_stream_readable.js:219:10)
at fs.read (internal/fs/streams.js:196:12)
at FSReqCallback.wrapper [as oncomplete] (fs.js:473:5)
    Emitted 'error' event at:
at Decipher.onerror (_stream_readable.js:690:12)
at Decipher.emit (events.js:182:13)
at writeAfterEnd (_stream_writable.js:245:10)
at Decipher.Writable.write (_stream_writable.js:291:5)
[... lines matching original stack trace ...]
at FSReqCallback.wrapper [as oncomplete] (fs.js:473:5)

ОБНОВЛЕНИЕ Кто-то спросил о расшифровке, файлы зашифрованы с использованием крипто модуля:

var decrypt = crypto.createDecipher(algorithm, password);

Кроме того, после прочтения res.end () никогда не отправляется после потоковой передачи файла клиенту я пробовал это:

var filestream = fs.createReadStream(file);
    filestream.pipe(decrypt).pipe(res, {end: false});
    filestream.on("close", function() {
        res.status(200);
        res.end();
    });
    filestream.on("error", function() {
        res.status(400);
        res.end();
    });

Не работает :(,я получаю ту же ошибку

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Эта ошибка обычно возникает, когда у нас недостаточно памяти. Поэтому мы должны закрыть каждый поток после его использования.

Потоки являются EventEmitters, поэтому вы можете прослушивать определенные события.

app.route( "/download" ).get( (req, res) => {
var filename = req.query.filename;
var file = __dirname + '/upload/' + filename;
var mimetype = mime.lookup(file);

res.setHeader('Content-disposition', 'attachment; filename=' + req.query.filename);
res.setHeader('Content-type', mimetype);

var filestream = fs.createReadStream(file);
filestream.pipe(decrypt).pipe(res);
filestream.on("finish", function(){
  res.send();
})

})
0 голосов
/ 13 ноября 2018

Просто используйте res.download(<filepath>).

https://expressjs.com/en/api.html#res.download

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...