3

node-zipのドキュメントの例に従って、メモリ内に 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)

では、zip データをブラウザに送信する適切な方法は何でしょうか?

4

2 に答える 2

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)
于 2013-07-13T19:26:53.130 に答える
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 に慣れていないため)、方向性を示す可能性があります。

于 2013-07-13T08:25:50.710 に答える