2 ответов:
вот пример программы, которая будет отправлять myfile. mp3 путем потоковой передачи его с диска (то есть, он не читает весь файл в память перед отправкой файла). Сервер слушает на порту 2000.
[обновление] как упоминалось @Aftershock в комментариях,
util.pumpушел и был заменен методом на прототипе потока под названием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/
вам нужно использовать поток для отправки файла (архива) в ответ, более того, вы должны использовать соответствующий тип контента в заголовке ответа.
есть пример функции, которая это делает:
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=[имя файла]" указывает имя файла, который будет загружен.
для получения дополнительной информации см. эта тема stackoverflow.
Comments