wake-up-neo.net

Vermeiden von Problemen mit dem Inhaltstyp beim Herunterladen einer Datei über einen Browser unter Android

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?

15
George Bailey

Damit Downloads mit allen (und besonders älteren) Android-Versionen wie erwartet funktionieren, müssen Sie ...

  1. setzen Sie den ContentType auf application/octet-stream
  2. setzen Sie den Dateinamenwert von Content-Disposition in doppelte Anführungszeichen
  3. schreiben Sie die Dateinamenerweiterung Content-Disposition in UPPERCASE

Lesen Sie meinen Blog-Post für weitere Details:
http://digiblog.de/2011/04/19/Android-and-the-download-file-headers/

24
Jpsy

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.

10
StevePayne

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

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.

0
Dmitriy R

Theoretisch sollte der Dateiname-Parameter auf Content-Disposition und nicht auf Content-Type festgelegt werden. Nicht sicher, ob dies beim Android-Browser hilfreich ist.

0
Julian Reschke