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
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");