2011-01-12 11 views
15

Si tengo un archivo disponible para un navegador a través de mi aplicación web, normalmente solo configuro la URL como http://website.com/webapp/download/89347/image.jpg. Luego configuro los encabezados HTTP Content-Type: application/octet-stream; filename=image.jpg y Content-Disposition: Attachment.Evitar problemas de tipo de contenido al descargar un archivo mediante el navegador en Android

Sin embargo, en Android. Parece que la única manera de que pueda descargar el archivo es establecer Content-Type: image/jpg. De lo contrario, el nombre del archivo dice <Unknown> y un error viene

Descarga incorrecta
No se puede descargar. 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 mantener una lista de tipos de mime?

+0

Hola George, estoy usando la misma técnica para hacer un enlace de descarga pero no entiendo cómo podemos establecer "cabeceras HTTP", mientras que la preparación de un enlace de enlace descendente para un ancla ¿etiqueta? ¿Puedes explicar más sobre esto? – nrsharma

+0

La configuración de los encabezados HTTP se realiza en el lado del servidor del servidor web, a menudo utilizando un lenguaje de programación como PHP, Java, CGI, etc. ¿Cómo está descargando sus archivos? –

+0

Tenga en cuenta que esta es una publicación anterior que hace referencia a algunas de las versiones anteriores de Android y puede tener información obsoleta. Content-Disposition se usa generalmente para indicar que se solicita una descarga, en lugar de solo 'ver'. –

Respuesta

24

Para hacer ningún tipo de descarga funcionan en todas las versiones de Android (y especialmente los mayores), como se esperaba, ya que ...

  1. establecer el ContentType a application/octet-stream
  2. poner el Content-Disposition valor de nombre de archivo entre comillas dobles
  3. escribir la extensión del fichero Content-Disposition en mayúsculas

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

+0

vea la respuesta de StevePayne si está experimentando que el dispositivo descargue la página html en lugar del archivo correcto. Lo resolví cambiando mi POST a GET. – nidal

+0

hI, si estoy descargando una imagen de downloadmanager, nuevamente no se abre con el error no se puede abrir el archivo. He establecido mimitype de solicitud a jpg. qué más tengo que hacer –

+0

* Android 4, Ice Cream Sandwich *. Ejemplo: 'Content-Disposition: attachment; filename = "MyFileName.ZIP"; 'no funcionará correctamente debido al punto y coma al final. ¿Alguna prueba (y resumen) para todas las versiones de Android? Útil: http://stackoverflow.com/questions/6319389/streaming-mime-type-application-pdf-from-asp-app-fails-in-google-chrome 'La versión Google Chrome v12 presentó un error que desencadena el problema que describir. Puede solucionarlo enviando el encabezado Content-Length' https://bugs.chromium.org/p/chromium/issues/detail?id=85549 – Kiquenet

0

He intentado todas las recomendaciones del blog Jspy y nada ha funcionado 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.

+4

Dmitriy, si su Android descarga el HTML de su página de origen (!), Entonces definitivamente hay algo mal con la lógica del script del servidor.Si la descarga falla en el lado de Android, entonces no habría posibilidad de tener el código HTML de origen en un archivo; por lo general, obtendría el contenido de la descarga pero no se escribiría en un archivo o un mensaje de error general. Pero el código fuente HTML no está disponible en ese momento. Piénsalo. – Jpsy

10

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

  • navegador de Android emite un POST HttpRequest al servidor (por ejemplo, botón o enlace de entrega para solicitar una descarga de archivos, filename.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 a Download.aspx, por ejemplo, para manejar la construcción del objeto de respuesta

  • El navegador Android envía HttpRequest GET correctamente 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.

  • 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.

  • Administrador de descargas de Android descargas nombre_de_archivo.ext, utilizando 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 asumo que es el administrador de descargas de Android el que causa el doble GET.

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

+3

Steve, tu explicación coincide mucho con las observaciones de los comentaristas de mi blog (mencionado en mi respuesta anterior). Este es un problema que parece suceder incluso con versiones de Android más altas (al menos hasta la 3.2.1) y parece depender del navegador en uso (las existencias de Dolphin y Android afectadas, FF y Opera no se ven afectadas). Una posible solución es reemplazar la primera solicitud por un GET o codificar (si es posible) todos los datos necesarios en la URL de la solicitud de descarga. Cheers, Jörg. – Jpsy

+1

Encontré problemas [1780] (http://code.google.com/p/android/issues/detail?id=1780) y [3948] (http://code.google.com/p/android/issues/detail? id = 3948) en el foro de Android, que describe la incapacidad del navegador de valores y el administrador de descargas de Android para gestionar correctamente las descargas iniciadas a través de solicitudes POST. Ambos informes han sido reconocidos por los moderadores del foro, pero etiquetados como "mejoras" en lugar de como errores. 1780 tiene más de 3 años, protagonizado por más de 100 visitantes y todavía no hay indicios de que se haya resuelto, ni siquiera en la última versión de Android (4.0.4 en este momento). – Jpsy

+0

¿Alguien encontró una solución? sigue siendo un problema válido. Recibo dos solicitudes en el servidor durante la descarga. ¿Es posible averiguar qué solicitud es falsa? – Diyko

0

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.

2

como he escrito en downloading files from android:

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

En 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. 
+0

Hola Martin, y bienvenido a StackOverflow. 1. No creo que las solicitudes POST sean parte de la pregunta, pero eso no es tan importante, y tal vez su respuesta sea útil para algunas personas. 2. Creo que la muestra del código no es relevante aquí. ** No uso php o aspx. **. 3. ** Recomiendo ** editar reemplaza el ejemplo de código con texto como "necesitarías crear una redirección como respuesta al POST, y luego hacer que el archivo se descargue desde la URL a la que redirigiste". Aquellos que buscan muestras de código deben publicar una pregunta para su idioma. –

+0

¿Qué *** Android *** _versions_ has probado? – Kiquenet

Cuestiones relacionadas