node / express Fuerza al navegador para descargar el archivo con un nombre personalizado

Construí un sitio web de nodo / expreso para mi proyecto universitario que, después de buscar la ID de una ley, muestra una tabla grande con todos los archivos en diferentes formatos e idiomas relacionados con esta ID. Uso el módulo ” http-proxy ” para solicitar y entregar estos archivos al cliente. No hay nada de malo en la publicación de archivos xml, xhtml, html y pdf (cada navegador puede verlos directamente). Tengo problemas con los archivos .zip y .rdf. Los archivos no están dañados, pero están perdiendo el nombre original

  • cuando hago clic en el ícono ZIP, aparece el indicador de descarga, pero estoy perdiendo el nombre del archivo original (el archivo se llamará “proxy” o “proxy.zip”, diferentes comportamientos en diferentes navegadores)
  • cuando hago clic en el icono de RDF, algunos navegadores abren el archivo directamente en el navegador, algunos no reconocen el formato, algunos navegadores quieren descargarlo con el nombre “proxy”)

Así que descubrí el atributo HTML5 “descargar” de la etiqueta “a”. Simplemente resuelve mi problema, de todos modos no es compatible con todas las versiones de Internet Explorer y Safari. Navegando por la web, encontré algunas soluciones para agregar “Hacer clic con el botón derecho y guardar como …” después de un enlace div cuando se ve la página en IE o Safari, pero esta solución no es para mí, porque no estoy hablando de una sola Enlace pero una tabla llena de enlaces. Y mi sitio necesita trabajar también en teléfonos móviles.

¿Hay alguna forma de escribir algún código del lado del servidor para forzar a los navegadores a descargar archivos con un nombre de archivo personalizado?

Aquí está el pequeño trozo de código del proxy:

var httpProxy = require('http-proxy'); var proxy = httpProxy.createProxyServer({ ignorePath: true }); app.get('/proxy', function(req , res) { var file = req.query.file; var realurl = 'http://'+cfg.edb_opt.host+':'+cfg.edb_opt.port+cfg.edb_opt.rest+file; console.log('Proxy: serving '+realurl); proxy.web(req, res, { 'target': realurl }); }); 

Todas las variables cfg * provienen de un archivo de configuración json para configurar el host, el puerto y la ruta de inicio donde se encuentran los archivos.

Gracias por adelantado 🙂

Debe agregar un nuevo encabezado al objeto de respuesta para indicar el nombre del archivo y hacer una descarga regular.

 res.set("Content-Disposition", "attachment;filename=somefile.ext"); 

También puede usar “inline” si, en cambio, desea que el navegador intente abrir el archivo dentro de sí mismo, como sucede con Chrome con archivos pdf.

 res.set("Content-Disposition", "inline;filename=somefile.ext"); 

Según la sugerencia de @Thomas, también es una buena idea incluir siempre el tipo de contenido correcto:

 res.set("Content-Type", "application/octet-stream"); 
    Intereting Posts