2013-07-13 2 views
2

Допустим, вы создать файл почтового индекса в памяти, следуя примеру из node-zip «s документации:Отправить почтовый созданный узел-Zip

var zip = new require('node-zip')() 
zip.file('test.file', 'hello there') 
var data = zip.generate({type:'string'}) 

Как вы затем отправить data в браузер таким образом, что он будет принимать это как скачать?

Я попытался это, но загрузка зависает на 150/150 байт и делает Chrome начинают есть 100% CPU:

res.setHeader('Content-type: application/zip') 
res.setHeader('Content-disposition', 'attachment; filename=Zippy.zip'); 
res.send(data) 

Так что правильный способ отправки данных почтового индекса в браузере?

ответ

1

Я рекомендую использовать потоки для этого подхода.

var fs = require('fs'); 
var zlib = require('zlib'); 
var http = require('http'); 

http.createServer(function(request, response) { 
    response.writeHead(200, { 'Content-Type': 'application/octet-stream' }); 

    var readStream = fs.createReadStream('test.file'); 
    var unzipStream = zlib.createUnzip();  

    readStream.pipe(unzipStream.pipe(response)); 
}).listen(3000); 

Это будет правильно не работает в реальном мире (как я не часто с Zlib), но это может дать вам направление

+0

Благодарности к Старт, Бодокайзер! Zlib не сокращает его, потому что мне нужна поддержка нескольких файлов, но это все равно помогло. Я отправлю полное решение за секунду. – Calder

6

Использование archiver и string-stream пакеты:

var archiver = require('archiver') 
var fs = require('fs') 
var StringStream = require('string-stream') 

http.createServer(function(request, response) { 
    var dl = archiver('zip') 
    dl.pipe(response) 
    dl.append(new fs.createReadStream('/path/to/some/file.txt'), {name:'YoDog/SubFolder/static.txt'}) 
    dl.append(new StringStream("Ooh dynamic stuff!"), {name:'YoDog/dynamic.txt'}) 
    dl.finalize(function (err) { 
    if (err) res.send(500) 
    }) 
}).listen(3000)