Node Express.js – Descargar archivo de la memoria – ‘nombre de archivo debe ser una cadena’

Estoy intentando empaquetar los datos en la memoria en un archivo de texto y enviarlos al usuario, lo que desencadena una descarga de archivos.

Tengo el siguiente código:

app.get('/download', function(request, response){ fileType = request.query.fileType; fileName = ( request.query.fileName + '.' + fileType ).toString(); fileData = request.query.fileData; response.set('Content-disposition', 'attachment; filename=' + fileName ); response.set('Content-type', 'text/plain'); var fileContents = new Buffer(fileData, "base64"); response.status(200).download( fileContents ); }); 

Sigue lanzando un error que dice que el parámetro de nombre de archivo de Content-disposition debe ser una cadena. fileName es ciertamente una cadena, así que no estoy seguro de lo que está pasando.

Actualizar:

Gracias a los consejos de @jfriend00, es mejor y más eficiente enviar directamente Buffer al cliente como archivo, en lugar de guardarlo primero en el disco del servidor.

Para implementar, se pueden usar stream.PassThrough() y pipe() , aquí hay un ejemplo:

 var stream = require('stream'); //... app.get('/download', function(request, response){ //... var fileContents = Buffer.from(fileData, "base64"); var readStream = new stream.PassThrough(); readStream.end(fileContents); response.set('Content-disposition', 'attachment; filename=' + fileName); response.set('Content-Type', 'text/plain'); readStream.pipe(res); }); 

Según el documento Express, la API res.download() es:

res.download (ruta [, nombre de archivo] [, fn])

Transfiere el archivo a la ruta como un “archivo adjunto”. Por lo general, los navegadores solicitarán al usuario la descarga. Por defecto, el parámetro “nombre de archivo =” del encabezado de disposición-contenido es la ruta (esto generalmente aparece en el cuadro de diálogo del navegador). Reemplace este valor predeterminado con el parámetro de nombre de archivo.

Tenga en cuenta que el primer parámetro de res.download() es una “ruta”, que indica la ruta del archivo en el servidor que se descargará. En su código, el primer parámetro es un búfer, por eso Node.js se queja de que “el parámetro de nombre de archivo debe ser una cadena”: de forma predeterminada, el parámetro “nombre de archivo =” del encabezado de Content-Disposition es la ruta .

Para hacer que su código funcione con res.download() , debe guardar el fileData en el servidor como un archivo, y luego invocar res.download() con la ruta de ese archivo:

 var fs = require('fs'); //... app.get('/download', function(request, response){ //... var fileContents = Buffer.from(fileData, "base64"); var savedFilePath = '/temp/' + fileName; // in some convenient temporary file folder fs.writeFile(savedFilePath, fileContents, function() { response.status(200).download(savedFilePath, fileName); }); }); 

Además, tenga en cuenta que el new Buffer(string[, encoding]) está en desuso ahora. Es mejor usar Buffer.from(string[, encoding]) .

    Intereting Posts