android - studio - no puedo descargar pdf en el movil
El navegador de Android no descargará el archivo pdf (1)
Tengo una aplicación web que permite a los usuarios descargar un archivo pdf. Es ASP.NET MVC y todo funciona bien en navegadores de escritorio, iPhone, Android Chrome y en una aplicación nativa de Android que anula la vista web setDownloadListener ().
Sin embargo, la descarga no parece funcionar cuando se usa 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 una tostada de "Comenzar descarga ..." y luego aparece una notificación completa de descarga 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 brindis 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...?J.h)...!E.S(lots o''binary data)
Como puede ver en la aplicación de rastreo / se descarga el contenido de PDF. También puede ver que no estoy usando el encabezado de disposición de contenido y la respuesta se descarga con codificación gzip.
¿Alguna idea sobre por qué esto no funciona en el navegador Android predeterminado? El usuario no tiene acceso a los datos descargados y no se inicia ningún visor (o intento). La respuesta simplemente se ignora silenciosamente. (Supongo que el navegador predeterminado de Android requiere la disposición del contenido o no me gusta Gzip en la descarga, pero estoy adivinando)
Actualización ----
Eliminé nuestro filtro de acción que estaba implementando la compresión Gzip y lo agregué al encabezado del archivo adjunto de Content-Disposition. entonces, 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 ---
intenté 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 sigo obteniendo los mismos resultados.
Encontré mi propia respuesta y fue mucho más simple que donde estaba buscando. Mi página con el enlace de descarga está en un iframe. Algo en el navegador predeterminado de Android pierde su descarga si ocurre en un iframe. Agregué target = "_ blank" a la etiqueta a que inicia la descarga y ahora todo funciona bien.
Aquí hay un código de muestra para demostrar el problema y la solució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>