Framework Expressjs имеет метод sendfile(). Как я могу это сделать, не используя целую структуру. Я использую node -native-zip для создания архива, и я хочу отправить его пользователю.
Nodejs отправляет файл в ответ
Ответ 1
Вот пример программы, которая будет отправлять myfile.mp3 потоковым потоком с диска (т.е. он не считывает весь файл в память перед отправкой файла). Сервер прослушивает порт 2000.
[Обновить] Как упоминалось в комментариях @Aftershock, util.pump
ушел и был заменен на метод прототипа Stream под названием pipe
; приведенный ниже код отражает это.
var http = require('http'),
fileSystem = require('fs'),
path = require('path');
http.createServer(function(request, response) {
var filePath = path.join(__dirname, 'myfile.mp3');
var stat = fileSystem.statSync(filePath);
response.writeHead(200, {
'Content-Type': 'audio/mpeg',
'Content-Length': stat.size
});
var readStream = fileSystem.createReadStream(filePath);
// We replaced all the event handlers with a simple call to readStream.pipe()
readStream.pipe(response);
})
.listen(2000);
Взято из http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/
Ответ 2
Вам нужно использовать Stream для отправки файла (архива) в ответ, что больше вам нужно использовать в заголовке ответа соответствующий Content-type.
Существует примерная функция:
const fs = require('fs');
// Where fileName is name of the file and response is Node.js Reponse.
responseFile = (fileName, response) => {
const filePath = "/path/to/archive.rar" // or any file format
// Check if file specified by the filePath exists
fs.exists(filePath, function(exists){
if (exists) {
// Content-type is very interesting part that guarantee that
// Web browser will handle response in an appropriate manner.
response.writeHead(200, {
"Content-Type": "application/octet-stream",
"Content-Disposition": "attachment; filename=" + fileName
});
fs.createReadStream(filePath).pipe(response);
} else {
response.writeHead(400, {"Content-Type": "text/plain"});
response.end("ERROR File does not exist");
}
});
}
}
Цель поля Content-Type - полностью описать данные, содержащиеся в теле, чтобы получающий пользовательский агент мог выбрать подходящий агент или механизм для представления данных пользователю или иным образом обрабатывать данные в надлежащим образом.
"application/octet-stream" определяется как "произвольные двоичные данные" в RFC 2046, цель этого типа содержимого должна быть сохранена на диск - это то, что вам действительно нужно.
"filename = [имя файла]" указывает имя файла, который будет загружен.
Для получения дополнительной информации см. fooobar.com/info/26919/....