2011-01-12 17 views
15

Se ho un file messo a disposizione un browser attraverso il mio webapp, ho normalmente solo impostare l'URL a qualcosa come http://website.com/webapp/download/89347/image.jpg. Ho quindi impostare le intestazioni HTTP Content-Type: application/octet-stream; filename=image.jpg e Content-Disposition: Attachment.evitare problemi di tipo di contenuto quando si scarica un file tramite il browser su Android

Tuttavia, su Android. Sembra che l'unico modo per ottenere il file da scaricare sia impostare Content-Type: image/jpg. In caso contrario, il nome del file dice <Unknown> e un errore viene

Download non riuscito
non può scaricare. Il contenuto non è supportato su questo telefono

C'è un modo per scaricare Android e aprire il file tramite il browser senza tenere un elenco di tipi MIME?

+0

Ciao George, sto usando la stessa tecnica per fare un link per il download, ma non ho ottenuto come possiamo impostare "intestazioni HTTP" mentre si prepara un collegamento downlink per un'ancora etichetta? puoi spiegare di più su questo? – nrsharma

+0

L'impostazione delle intestazioni HTTP viene eseguita sul lato server sul server Web, spesso utilizzando un linguaggio di programmazione come PHP, Java, CGI, ecc. Come si stanno servendo i file per il download? –

+0

Ricorda che questo è un post più vecchio che fa riferimento ad alcune delle precedenti versioni di Android e potrebbe avere informazioni obsolete. Content-Disposition viene in genere utilizzato per indicare che è richiesto un download, anziché solo una 'visualizzazione'. –

risposta

24

Per effettuare alcun download funzionano su tutti (e soprattutto anziani) versioni di Android come previsto, è necessario ...

  1. impostare il ContentType a application/octet-stream
  2. mettere il Content-Disposition valore di nome di file tra virgolette
  3. scrivere l'estensione del file Content-Disposition in maiuscolo

Leggi il mio post sul blog per maggiori dettagli:
http://digiblog.de/2011/04/19/android-and-the-download-file-headers/

+0

vedi StevePayne rispondi se stai riscontrando che il dispositivo sta scaricando la pagina html anziché il file corretto. Ho risolto questo cambiando il mio post su un GET. – nidal

+0

hI, se sto scaricando l'immagine da downloadmanager, di nuovo non si apre con errore non può aprire il file. Ho impostato il mimitype della richiesta su jpg. cos'altro devo fare –

+0

* Android 4, Ice Cream Sandwich *. Esempio: 'Content-Disposition: attachment; filename = "MyFileName.ZIP"; 'non funzionerà correttamente a causa del punto e virgola alla fine. Qualche test (e _summary_) per tutte le versioni di Android? Utile: http://stackoverflow.com/questions/6319389/streaming-mime-type-application-pdf-from-asp-app-fails-in-google-chrome "La versione di Google Chrome v12 ha introdotto un bug che fa scattare il problema descrivere. È possibile risolvere il problema inviando l'intestazione Content-Length "https://bugs.chromium.org/p/chromium/issues/detail?id=85549 – Kiquenet

0

Ho provato tutte le raccomandazioni da Jspy blog e niente ha funzionato finora. Content-disposition porta il browser in modalità download, tuttavia non viene scaricato nulla tranne HTML della pagina da cui è stato avviato il download. Quindi la mia conclusione, è puro bug di Google e possiamo solo pregare che Google lo risolva. Il mio compito consisteva nell'impostare il tipo di contenuto in un tipo proveniente dal browser mobile Accept intestazione. Funziona generalmente, puoi anche scaricare i file zip come testo.

+4

Dmitriy, se il tuo Android scarica l'HTML della tua pagina sorgente (!), Allora c'è sicuramente qualcosa di sbagliato nella logica del tuo server script.Se il download non funziona sul lato di Android, non ci sarebbe alcuna possibilità di avere il codice HTML sorgente in un file, in genere si otterrebbe il contenuto del download ma non verrà scritto in un file o in un messaggio di errore generale. Ma l'HTML sorgente non è disponibile in quel momento. Pensaci. – Jpsy

10

Dmitriy (o altri che cercano una soluzione possibile) se nel file scaricato appare una pagina html, sospetto che ciò sia dovuto al doppio problema HttpRequest GET. Uno scenario tipico è il seguente post, Redirect, ottengono il modello:

  • Android del browser emette un HttpRequest POST al server (ad esempio pulsante o collegamento presentare per richiedere un file di download, filename.ext dire)

  • Server invia il file filename.ext ai byte, archivia in una variabile di sessione e quindi invia Response.Redirect a Download.aspx, ad esempio, per gestire la struttura dell'oggetto risposta

  • Il browser Android invia HttpRequest GET al server per Download.aspx

  • Server risponde con la tipica Content-Disposition: attachment; nomefile = "nomefile.ext" costruisce lo stile con l'oggetto risposta contenente il nomefile richiesto.ext, essendo i byte nella variabile di sessione.

  • Android download manager, credo, quindi invia un'altra HttpRequest GET al server per Download.aspx. Sospetto che il download manager interpreti la precedente risposta "allegato" come trigger per inviare questo secondo GET.

  • Il server (Download.aspx) tenta nuovamente di costruire l'oggetto risposta da inviare al browser.

  • Gestione download Android scarica filename.ext, utilizzando il contenuto dell'oggetto risposta dal secondo Download.aspx.

In molti scenari che sarebbe stato perfetto. Ma se, ad esempio, il server nel codice Download.aspx esegue alcune operazioni di manutenzione e rimuove la variabile di sessione alla prima chiamata, la volta successiva non vi è alcuna variabile di sessione. Quindi, a seconda di come è scritto il codice, è possibile che l'oggetto di risposta non venga costruito in modo esplicito e forse la Response.End non viene chiamata e quindi solo l'html di Download.aspx finisce per essere inviato.

Questo è quello che abbiamo scoperto usando Wireshark, anche se ammetto che sto assumendo che sia il gestore di download di Android che è la causa del doppio GET.

Spero che questa spiegazione sia stata di aiuto.

+3

Steve, la tua spiegazione coincide molto con le osservazioni dei commentatori del mio post sul blog (menzionate nella mia risposta sopra). Questo è un problema che sembra accadere anche con versioni più alte di Android (almeno fino a 3.2.1) e sembra dipendere dal browser in uso (i titoli Dolphin e Android interessati, FF e Opera non sono interessati). Una possibile soluzione è sostituire la prima richiesta con un GET o codificare (se possibile) tutti i dati necessari nell'URL della richiesta di download. Cheers, Jörg. – Jpsy

+1

Ho riscontrato problemi [1780] (http://code.google.com/p/android/issues/detail?id=1780) e [3948] (http://code.google.com/p/android/issues/detail? id = 3948) nel forum Android, che descrive l'impossibilità del browser di riserva e del gestore di download di Android di gestire correttamente i download avviati tramite le richieste POST. Entrambi i report sono stati riconosciuti dai moderatori del forum, ma etichettati come "miglioramenti" anziché come bug. 1780 ha più di 3 anni, ha recitato per +100 visitatori e non vi è ancora alcuna indicazione che sia stato risolto, nemmeno nell'ultima versione di Android (4.0.4 in questo momento). – Jpsy

+0

qualcuno ha trovato una soluzione? è ancora un problema valido. Ricevo due richieste sul server durante il download. È possibile capire quale richiesta è falsa? – Diyko

0

In teoria, il parametro filename deve essere impostato su Content-Disposition, non Content-Type. Non sono sicuro se ciò sarà d'aiuto con il browser Android.

2

Come ho scritto in downloading files from android:

Android del browser non scaricare il file in eventi pulsante postali. Negli eventi post il file sarà un file .htm. per sopra venire questo fa come sotto.

In pulsante per il download clicca

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

Ciao Martin, benvenuto su StackOverflow. 1. Non credo che le richieste di POST siano parte della domanda, ma non è così importante, e forse la tua risposta è utile ad alcune persone. 2. Penso che il codice di esempio non sia rilevante qui. ** Non uso php o aspx. **. 3. ** Raccomando ** modifica sostituisci il codice di esempio con testo come "dovresti creare un reindirizzamento come risposta al POST e quindi scaricare il file dall'URL a cui sei stato reindirizzato". Chi è alla ricerca di esempi di codice dovrebbe pubblicare una domanda per la propria lingua. –

+0

Quale *** Android *** _versions_ hai testato? – Kiquenet