node.js - proyecto - Crea dinĂ¡micamente y transmite zip al cliente
node js tutorial pdf (3)
Si es posible. Recomiendo echar un vistazo a Streams Playground para tener una idea de cómo funciona Node Streams.
La compresión zip en la biblioteca central de zlib no parece admitir múltiples archivos. Si quieres usar tar-gzip, puedes hacerlo con node-tar . Pero si quieres ZIP, adm-zip parece la mejor opción. Otra posibilidad es el Archiver .
Actualizar:
Este example muestra cómo usar Archiver, que soporta streams. Simplemente sustituya fs.createReadStream
con las secuencias que está creando dinámicamente, y tenga una output
a la res
de Express en lugar de a fs.createWriteStream
.
var fs = require(''fs'');
var archiver = require(''archiver'');
var output = fs.createWriteStream(__dirname + ''/example-output.zip'');
var archive = archiver(''zip'');
output.on(''close'', function() {
console.log(''archiver has been finalized and the output file descriptor has closed.'');
});
archive.on(''error'', function(err) {
throw err;
});
archive.pipe(output);
var file1 = __dirname + ''/fixtures/file1.txt'';
var file2 = __dirname + ''/fixtures/file2.txt'';
archive
.append(fs.createReadStream(file1), { name: ''file1.txt'' })
.append(fs.createReadStream(file2), { name: ''file2.txt'' });
archive.finalize(function(err, bytes) {
if (err) {
throw err;
}
console.log(bytes + '' total bytes'');
});
Estoy usando NodeJs (w / express) y estoy tratando de transmitir un archivo zip al cliente. Los archivos contenidos en el archivo zip no viven en el sistema de archivos, sino que se crean dinámicamente. Me gustaría transmitir el contenido del archivo (s) al archivo zip y transmitir el archivo zip al cliente.
IE quiero que el cliente reciba:
tmp.zip
--> 1.txt
--> 2.txt
--> 3.txt
Donde se crean 1,2,3.txt sobre la marcha y se transmiten al archivo zip. es posible?
solución con: express.js, wait.for, zip-stream
app.get(''/api/box/:box/:key/download'', function (req, res) {
var wait = require(''wait.for'');
var items = wait.for(function (next) {
BoxItem.find({box: req.Box}).exec(next)
});
res.set(''Content-Type'', ''application/zip'');
res.set(''Content-Disposition'', ''attachment; filename='' + req.Box.id + ''.zip'');
var ZipStream = require(''zip-stream'');
var zip = new ZipStream();
zip.on(''error'', function (err) {
throw err;
});
zip.pipe(res);
items.forEach(function (item) {
wait.for(function (next) {
var path = storage.getItemPath(req.Box, item);
var source = require(''fs'').createReadStream(path);
zip.entry(source, { name: item.name }, next);
})
});
zip.finalize();
});
Archiver tiene un método de adición que le permite guardar texto como un archivo. Para "transmitir" esos datos al usuario, simplemente puede canalizar al objeto de respuesta HTTP.
var Http = require(''http'');
var Archiver = require(''archiver'');
Http.createServer(function (request, response) {
// Tell the browser that this is a zip file.
response.writeHead(200, {
''Content-Type'': ''application/zip'',
''Content-disposition'': ''attachment; filename=myFile.zip''
});
var zip = Archiver(''zip'');
// Send the file to the page output.
zip.pipe(response);
// Create zip with some files. Two dynamic, one static. Put #2 in a sub folder.
zip.append(''Some text to go in file 1.'', { name: ''1.txt'' })
.append(''Some text to go in file 2. I go in a folder!'', { name: ''somefolder/2.txt'' })
.file(''staticFiles/3.txt'', { name: ''3.txt'' })
.finalize();
}).listen(process.env.PORT);
Esto creará un archivo zip con los dos archivos de texto. Al usuario que visita esta página se le presentará un aviso de descarga de archivos.