Evitar problemas de tipo de contenido al descargar un archivo a través del navegador en Android

Si tengo un archivo disponible para un navegador a través de mi aplicación web, normalmente solo configuro la URL como http://sofes.miximages.com/android/image.jpg . Luego configuro los encabezados HTTP Content-Type: application/octet-stream; filename=image.jpg Content-Type: application/octet-stream; filename=image.jpg y Content-Disposition: Attachment .

Sin embargo, en Android. Parece que la única manera en que puedo obtener la descarga del archivo es establecer Content-Type: image/jpg . De lo contrario, el nombre del archivo dice y aparece un error

Descargar sin éxito
No puede descargarse. El contenido no es compatible con este teléfono

¿Hay alguna forma de que pueda descargar Android y abrir el archivo a través del navegador sin guardar una lista de tipos de mime?

Para que las descargas funcionen en todas las versiones de Android (y especialmente en versiones anteriores) como se esperaba, debes …

  1. establecer ContentType en application / octet-stream
  2. poner el valor del nombre del archivo Content-Disposition entre comillas dobles
  3. escriba la extensión de nombre de archivo Content-Disposition en MAYÚSCULAS

Lee la publicación de mi blog para más detalles:
http://digiblog.de/2011/04/19/android-and-the-download-file-headers/

Dmitriy (u otras personas que buscan una posible solución) si aparece una página html en su archivo descargado, sospecho que esto se debe al doble problema HttpRequest GET. Un escenario típico es el siguiente modelo POST, Redirect, GET:

  • El navegador de Android emite una HttpRequest POST al servidor (por ejemplo, enviar un botón o un enlace para solicitar un archivo de descarga, nombre de archivo.ext decir)

  • El servidor transmite el nombre de archivo solicitado.ext a bytes, almacena en una variable de sesión y luego emite Response.Redirect to Download.aspx, por ejemplo, para manejar la construcción del objeto de respuesta

  • El navegador de Android envía correctamente HttpRequest GET al servidor para Download.aspx

  • El servidor responde con una disposición de contenido típica: archivo adjunto; filename = “filename.ext” constructo de estilo con el objeto de respuesta que contiene el nombre de archivo solicitado.ext, siendo los bytes en la variable de sesión.

  • El administrador de descargas de Android, creo, luego envía otro HttpRequest GET al servidor para Download.aspx. Sospecho que el administrador de descargas interpreta la respuesta anterior de “adjunto” como un disparador para enviar este segundo GET.

  • Servidor (Download.aspx) de nuevo intenta construir el objeto de respuesta para enviar de vuelta al navegador.

  • El administrador de descargas de Android descarga filename.ext, usando el contenido del objeto de respuesta del segundo Download.aspx.

En muchos escenarios esto estaría bien. Pero si, por ejemplo, el servidor en el código Download.aspx realiza algunas tareas domésticas y elimina la variable de sesión la primera vez que se llama, la próxima vez no habrá una variable de sesión. Entonces, dependiendo de cómo se escribe el código, es posible que el objeto de respuesta no se construya explícitamente y tal vez el Response.End no se llame y solo se envíe el html de Download.aspx.

Esto es lo que descubrimos usando Wireshark, aunque admito que estoy asumiendo que es el administrador de descargas de Android el que causa el doble GET.

Espero que esta explicación haya sido de alguna ayuda.

Como escribí al descargar archivos de Android :

El navegador de Android no descargará el archivo en el botón Publicar eventos. En eventos posteriores, el archivo será un archivo de basura .htm. para vencer esto haz lo siguiente.

En el botón de descarga, haga clic

  protected void ImageButton1_Click(object sender, ImageClickEventArgs e) { Response.Redirect("download-file.aspx"); } and on download-file.aspx file do as below using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class mobile_download_file : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string filename = "usermanual.pdf"; Response.ContentType = "application/octet-stream"; Response.AppendHeader("Content-Disposition", "attachment; filename=" + "" + filename + ""); Response.Write(Server.MapPath(Request.ApplicationPath) + "\\" + filename); Response.TransmitFile(Server.MapPath(Request.ApplicationPath) + "\\" + filename); Response.End(); } } the same can be implemented in php also. 

He intentado todas las recomendaciones del blog Jspy y nada funcionó hasta ahora. Content-disposition trae el navegador en modo de descarga, sin embargo, no se descarga nada, excepto el HTML de la página desde la cual se inició la descarga. Así que mi conclusión, es un error de Google y solo podemos orar por que Google lo solucione. Mi trabajo consistió en establecer el tipo de contenido en algún tipo proveniente de Accept header form mobile browser. Por lo general, funciona, incluso puede descargar archivos zip como texto.

En teoría, el parámetro de nombre de archivo debe establecerse en Content-Disposition, no Content-Type. No estoy seguro de si esto ayudará con el navegador Android.