meteor iron-router

¿Cómo se sirve un archivo usando el enrutador de hierro o el meteoro en sí?



iron-router (1)

Estoy intentando servir un archivo zip en mi aplicación Meteor, pero estoy atascado. Después de buscar en Google, parece que la mejor manera de hacerlo es con Iron Router, pero no sé cómo:

Router.map -> @route "data", where: ''server'' path: ''/data/:id'' action: -> data = getBase64ZipData(this.params.id) this.response.writeHead 200, { ''Content-Type'': ''application/zip;base64'' } ???


En el servidor:

var fs = Npm.require(''fs''); var fail = function(response) { response.statusCode = 404; response.end(); }; var dataFile = function() { // TODO write a function to translate the id into a file path var file = fileFromId(this.params.id); // Attempt to read the file size var stat = null; try { stat = fs.statSync(file); } catch (_error) { return fail(this.response); } // The hard-coded attachment filename var attachmentFilename = ''filename-for-user.zip''; // Set the headers this.response.writeHead(200, { ''Content-Type'': ''application/zip'', ''Content-Disposition'': ''attachment; filename='' + attachmentFilename ''Content-Length'': stat.size }); // Pipe the file contents to the response fs.createReadStream(file).pipe(this.response); }; Router.route(''/data/:id'', dataFile, {where: ''server''});

En el cliente:

<a href=''/data/123''>download zip</a>

Lo bueno de esto es que descargará el archivo como un archivo adjunto, y puede personalizar el nombre de archivo que ve el usuario. El truco está en escribir la función fileFromId . Encuentro que es más fácil almacenar todos mis archivos generados dinámicamente en /tmp .

Esta respuesta supone que los archivos se generan dinámicamente. Si desea servir contenido estático, puede simplemente poner sus archivos en el directorio public . Vea esta pregunta para más detalles.