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.

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.

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> 
  • Administrador de descarga de navegador para Android
  • ¿Cómo puedo transferir una imagen de su URL a la tarjeta SD?
  • Descargar la base de datos SQLite desde Internet y cargarla en la aplicación de Android
  • Android: Descargar un solo archivo en muchas partes
  • ¿Dónde puedo descargar Eclipse Android Bundle
  • Android escribe en la carpeta de la tarjeta sd
  • ¿Por qué este cursor está vacío?
  • Android - Descargas de archivos grandes detener - utilizando async / progressdialog
  • HTTP Async Downloader con auto-resume en error
  • Android youtube descargar url 403 prohibido
  • Cómo descargar y guardar un archivo usando phonegap / cordova en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.