Tengo un requisito inusual. Básicamente, necesito una forma para que, cuando el usuario haga clic en un enlace o botón, reciba un PDF. La parte difícil aquí es que el servidor no procesará la solicitud en total a menos que se envíe un encabezado personalizado (de lo contrario, considera que la persona se desconectó y lo envía a la pantalla de inicio de sesión).Solicitar un archivo con un encabezado personalizado
En este momento, la forma en que funciona el encabezado no se puede cambiar, así que no se preocupe por ello; Cambiará en el futuro y es una aplicación interna sobre la que no tengo control.
Las opciones que han explorado:
- El uso de un iframe o simplemente abrir una nueva ventana con algún tipo de ruta que devolverá el PDF. Esto no puede funcionar porque no puedo especificar el encabezado requerido para el PDF y sería redirigido antes de llegar al PDF.
- El uso de un formulario y el envío de la solicitud no pueden funcionar porque no puedo agregar encabezados personalizados a los formularios (solo XHR y los complementos pueden, AFAIK).
- El uso de XHR no puede funcionar porque, si bien puede agregar el encabezado y recuperar el archivo, no hay forma de guardarlo en el lado del cliente.
Al parecer, mis únicas opciones en este punto son esencialmente:
- utilizar algún tipo de plug-in como Flash o Silverlight para solicitar el archivo.
- Fuerce el cambio del requisito mucho antes de lo esperado para que ya no se requiera un encabezado.
¿Hay algo que me falta aquí? Espero que alguien pueda verificar mis hallazgos o señalarme algo que eché de menos porque, por lo que puedo ver, no hay nada que pueda hacer aquí.
EDIT: Esto parece apto y confirma lo que estaba pensando: XMLHttpRequest to open PDF in browser
¿Qué tal si agregas algún tipo de túnel entre la aplicación y tu script? El túnel podría consultar la aplicación y recibir el archivo, y luego establecer un encabezado adecuado antes de enjuagar el archivo para el usuario, lo que realmente desencadena una descarga. No sé si esto es posible para su sistema, dependiendo de la seguridad. –
Un túnel no es una mala idea, aunque no estoy seguro de que podamos implementarlo aquí. Hmm. Gracias, lo investigaré. – Kris
Si puede prescindir de soporte para IE <10 (no es muy probable, ¿no?), Podría usar XMLHttpRequest Nivel 2 (XHR2) y Blob URL. Aquí hay un ejemplo: http://stackoverflow.com/q/9620497 Vea también http://stackoverflow.com/q/6165266 y http://www.html5rocks.com/en/tutorials/file/xhr2/ –