Wenn ich eine Datei über meine Webanwendung einem Browser zur Verfügung stellen kann, setze ich die URL normalerweise auf etwas wie http://website.com/webapp/download/89347/image.jpg
. Dann setze ich die HTTP-Header Content-Type: application/octet-stream; filename=image.jpg
und Content-Disposition: Attachment
.
Allerdings auf dem Android. Die einzige Möglichkeit, die Datei zum Herunterladen zu erhalten, scheint Content-Type: image/jpg
zu sein. Andernfalls lautet der Dateiname <Unknown>
und es wird ein Fehler angezeigt
Download nicht erfolgreich
Kann nicht herunterladen. Der Inhalt wird auf diesem Telefon nicht unterstützt
Gibt es eine Möglichkeit, mit Android die Datei herunterzuladen und über den Browser zu öffnen, ohne eine Liste der MIME-Typen zu führen?
Damit Downloads mit allen (und besonders älteren) Android-Versionen wie erwartet funktionieren, müssen Sie ...
Lesen Sie meinen Blog-Post für weitere Details:
http://digiblog.de/2011/04/19/Android-and-the-download-file-headers/
Dmitriy (oder andere, die nach einer möglichen Lösung suchen) Wenn in Ihrer heruntergeladenen Datei eine HTML-Seite angezeigt wird, vermute ich, dass dies auf das doppelte HttpRequest GET-Problem zurückzuführen ist. Ein typisches Szenario ist das folgende POST-, Redirect- und GET-Modell:
Der Android-Browser sendet ein HttpRequest POST an den Server (z. B. "Senden" oder Link, um eine Download-Datei anzufordern, z. B. Dateiname.ext).
Der Server überträgt den angeforderten Dateinamen.ext in Bytes, speichert ihn in einer Sitzungsvariablen und gibt dann eine Response.Redirect-Datei an Download.aspx aus, um beispielsweise den Aufbau des Antwortobjekts zu behandeln
Der Android-Browser sendet HttpRequest GET ordnungsgemäß an den Server für Download.aspx
Server antwortet mit typischer Inhaltsdisposition: Anhang; Dateiname = "Dateiname.ext" -Stilkonstrukt mit dem Antwortobjekt, das den angeforderten Dateinamen.ext enthält, sind die Bytes in der Sitzungsvariablen.
Ich glaube, der Download-Manager für Android sendet dann ein weiteres HttpRequest-GET für Download.aspx an den Server. Ich vermute, dass der Download-Manager die vorherige Antwort "Anhang" als Auslöser für das Senden dieses zweiten GET interpretiert.
Server (Download.aspx) versucht erneut, das Antwortobjekt zu erstellen, das an den Browser gesendet wird.
Der Android-Download-Manager lädt dateiname.ext mit den Inhalten des Antwortobjekts aus dem zweiten Download.aspx herunter.
In vielen Szenarien wäre dies gut. Wenn jedoch der Server im Code "Download.aspx" beispielsweise beim ersten Aufruf etwas Housekeeping vornimmt und die Sitzungsvariable entfernt, ist beim nächsten Mal keine Sitzungsvariable vorhanden. Abhängig davon, wie der Code geschrieben wird, ist es möglich, dass das Antwortobjekt nicht explizit konstruiert wird und möglicherweise Response.End nicht aufgerufen wird, sodass nur die HTML-Datei von Download.aspx gesendet wird.
Dies haben wir mit Wireshark entdeckt, obwohl ich zugeben muss, dass es der Android-Download-Manager ist, der die Ursache für das doppelte GET ist.
Ich hoffe, diese Erklärung hat etwas geholfen.
Wie ich geschrieben habe: Dateien von Android herunterladen :
Der Android-Browser lädt die Datei nicht in der Schaltfläche Ereignisse hochladen. Bei Postereignissen handelt es sich bei der Datei um eine .htm-Garbage-Datei. überkommen Sie dies wie unten.
Klicken Sie im Download-Button auf
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.
Ich habe alle Empfehlungen aus dem Jspy-Blog ausprobiert und bisher hat nichts funktioniert. Content-Disposition bringt den Browser in den Download-Modus, es wird jedoch nichts heruntergeladen außer HTML der Seite, von der aus der Download initiiert wurde. Mein Fazit: Es ist ein reiner Fehler von Google, und wir dürfen nur dafür beten, dass Google es repariert. Meine Aufgabe bestand darin, den Inhaltstyp auf einen Typ festzulegen, der aus dem Header des Accept-Headers aus dem mobilen Browser stammt. Es funktioniert im Allgemeinen, Sie können sogar Zip-Dateien als Text herunterladen.
Theoretisch sollte der Dateiname-Parameter auf Content-Disposition und nicht auf Content-Type festgelegt werden. Nicht sicher, ob dies beim Android-Browser hilfreich ist.