El navegador de Android no descargará el archivo pdf
Tengo una aplicación web que permite a los usuarios descargar un archivo pdf. Es ASP.NET MVC y todo funciona bien en los navegadores de escritorio, iPhone, Android Chrome y en una aplicación nativa de Android que reemplaza a Web View setDownloadListener ().
Sin embargo, la descarga no parece funcionar cuando se utiliza el navegador predeterminado de Android. Estoy probando en un Galaxy Nexus con 4.2.2 y en un Nexus S 4g con 2.3.7. Tengo aplicaciones de visor de PDF instaladas en ambos dispositivos.
- Trigger android gestor de descargas Cordova
- ¿Cómo mostrar el estado de "Cargando" en Android?
- ¿Cómo saber el tamaño de un archivo antes de descargarlo?
- Evitar problemas de tipo de contenido al descargar un archivo a través del navegador en Android
- Android cómo medir la velocidad de carga / descarga wifi / 2G / 3G ...?
Cuando pruebo en Android Chrome, el usuario ve un tostado de "Inicio de descarga …" y luego se muestra una notificación de Descarga completa en la barra de estado. El usuario puede tocar esta notificación para abrir el archivo en un visor de pdf. En el navegador predeterminado de Android no hay tostadas y no se guarda ningún archivo de descarga.
Puse wireshark en la red y veo la siguiente solicitud:
GET /appapth/ViewPDF/8383600280757433_11_05_2012 HTTP/1.1 Host: 192.168.1.117 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 X-Requested-With: com.google.android.browser User-Agent: Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Galaxy Nexus Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 Accept-Encoding: gzip,deflate Accept-Language: en-US Accept-Charset: utf-8, iso-8859-1, utf-16, *;q=0.7 Cookie: (lots o'cookie data)
Y la respuesta es:
HTTP/1.1 200 OK Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache Content-Type: application/pdf Content-Encoding: gzip Expires: -1 Server: Microsoft-IIS/7.5 Set-Cookie: ___TempData=; path=/ Set-Cookie: ___TempData=(lot's o'cookie data); path=/; HttpOnly Date: Mon, 01 Apr 2013 18:22:20 GMT Content-Length: 48244 ......YQ.....T...?Jh)...!ES(lots o'binary data)
Como se puede ver en el seguimiento de la aplicación / pdf se descarga el contenido. También puede ver que no estoy usando el encabezado de disposición de contenido y la respuesta se descarga con la codificación gzip.
¿Alguna idea sobre por qué esto no funciona en el navegador predeterminado de Android? El usuario no tiene acceso a los datos descargados y no se inicia ningún visor (o intención). La respuesta es silenciosamente ignorada. (Supongo que el navegador predeterminado de Android requiere la disposición del contenido o no le gusta Gzip en la descarga, pero sólo estoy adivinando)
Actualización —-
Quité nuestro filtro de acción que estaba implementando la compresión Gzip y lo agregué en el encabezado de adjuntos Content-Disposition. Así, el código MVC en mi controlador es como:
public virtual ActionResult ViewPDF(string id) { try { byte[] pdf = GetPDFContent(id); FileContentResult fcr = new FileContentResult(pdf, "application/pdf"); fcr.FileDownloadName = id + ".pdf"; return fcr; }
Y la respuesta Http es ahora:
HTTP/1.1 200 OK Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache Content-Type: application/pdf Expires: -1 Server: Microsoft-IIS/7.5 Content-Disposition: attachment; filename=433_07_05_2012.pdf Set-Cookie: ___TempData=; path=/ Set-Cookie: ___TempData=(lots o'cookie data);path=/; HttpOnly Date: Mon, 01 Apr 2013 19:56:07 GMT Content-Length: 59069 %PDF-1.3 %.... 13 0 obj << (lots o'binary pdf data)
Ya no hay ningún gzip y hay una disposición de contenido, pero en el navegador predeterminado de Android todavía no hay descarga visible.
Actualización 2 —
Probado las sugerencias de https://stackoverflow.com/a/5728859/90236 y http://winzter143.blogspot.com/2012/03/android-handling-of-content-disposition.html y http: // androidforums. Com / application-development / 256987-android-phone-download-issue-asp-net-website.html pero todavía obtengo los mismos resultados.
- DownloadManager.ACTION_DOWNLOAD_COMPLETE Receptor de difusión que recibe el mismo ID de descarga más de una vez con diferentes estados de descarga en Android
- AsyncTask - descarga lenta
- Agregue manualmente archivos locales a la aplicación Descargas
- ¿Cuál es la mejor manera de descargar archivos de net programatically en android?
- Descarga de archivos zip en android
- Facebook SDK para la descarga de Android siempre falla
- Android - tantos problemas con la biblioteca de expansión
- Android instala un apk de la URL
Encontré mi propia respuesta y era mucho más simple que donde yo estaba buscando. Mi página con el enlace de descarga está en un iframe. Algo en el navegador predeterminado de Android pierde la descarga si se produce en un iframe. He añadido target = "_ blank" a la etiqueta que inicia la descarga y todo ahora funciona bien.
He aquí un ejemplo de código para demostrar el problema y la corrección.
<html> <head><title>Test page</title></head> <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> <body> <a href="http://www.adobe.com/products/eulas/pdfs/Photoshop_On_a_Server_Policy_5-31-2011.pdf"> Download sample pdf</a><br /> <iframe src="inner.html" /> </body> </html>
Y inner.html:
<html> <head><title>test iframe</title></head> <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> <body> <p>This does NOT work on Android default browser. <a href="http://www.adobe.com/products/eulas/pdfs/Photoshop_On_a_Server_Policy_5-31-2011.pdf"> Download sample pdf within iframe</a></p> <p><a href="http://www.adobe.com/products/eulas/pdfs/Photoshop_On_a_Server_Policy_5-31-2011.pdf" target="_blank">Download sample pdf within iframe with target</a>.</p> </body> </html>