web-dev-qa-db-ja.com

Androidでブラウザを介してファイルをダウンロードするときのコンテンツタイプの問題の回避

Webアプリケーションを介してブラウザーでファイルを使用できるようにしている場合は、通常、URLをhttp://website.com/webapp/download/89347/image.jpgのように設定します。次に、HTTPヘッダーContent-Type: application/octet-stream; filename=image.jpgおよびContent-Disposition: Attachmentを設定します。

ただし、Androidでは。ファイルをダウンロードするには、Content-Type: image/jpgを設定するしかありません。そうでない場合、ファイル名は<Unknown>となり、エラーが発生します

ダウンロード失敗
ダウンロードできません。この電話ではコンテンツはサポートされていません

Androidを取得して、MIMEタイプのリストを保持せずにブラウザからファイルをダウンロードして開く方法はありますか?

16
Bryan Field

すべてのダウンロード(特に古いバージョン)でダウンロードを機能させるには、Android=バージョンを期待どおりにするには、次のことを行う必要があります...

  1. contentTypeをapplication/octet-streamに設定します
  2. content-Dispositionファイル名の値を二重引用符で囲みます
  3. content-Dispositionファイル名拡張子を大文字で記述します

詳細については私のブログ投稿を読んでください:
http://digiblog.de/2011/04/19/Android-and-the-download-file-headers/

25
Jpsy

Dmitriy(または他の解決策を模索している人)がダウンロードしたファイルにHTMLページが表示されている場合、これはHttpRequest GETの問題が原因であると考えられます。典型的なシナリオは、次のPOST、リダイレクト、GETモデルです。

  • AndroidブラウザーがHttpRequest POST=をサーバーに発行します(たとえば、送信ファイルまたはダウンロードファイルを要求するためのリンク、filename.extが言う)

  • サーバーは、要求されたfilename.extをバイトにストリーミングし、セッション変数に格納してから、たとえばResponse.RedirectをDownload.aspxに発行して、応答オブジェクトの構築を処理します。

  • Androidブラウザーは、HttpRequest GETをDownload.aspxのサーバーに正しく送信します

  • サーバーは典型的なContent-Disposition:添付ファイルで応答します。 filename = "filename.ext"スタイルの構成要素。要求されたfilename.extを含む応答オブジェクトがあり、セッション変数のバイト数です。

  • Androidダウンロードマネージャーは、サーバーにDownload.aspxの別のHttpRequest GETを送信すると思います。ダウンロードマネージャーは、前の "attachment"応答を、この2番目のGETを送信するトリガーとして解釈していると思います。

  • サーバー(Download.aspx)は、ブラウザーに送り返す応答オブジェクトを作成しようとします。

  • Androidダウンロードマネージャーは、2番目のDownload.aspxからの応答オブジェクトのコンテンツを使用して、filename.extをダウンロードします。

多くのシナリオではこれで問題ありません。ただし、たとえば、Download.aspxコード内のサーバーがハウスキーピングを実行し、最初に呼び出されたときにセッション変数を削除すると、次回はセッション変数がなくなります。したがって、コードの記述方法によっては、応答オブジェクトが明示的に構築されず、Response.Endが呼び出されず、Download.aspxのhtmlのみが送信される可能性があります。

これは、Wiresharkを使用して発見したものですが、ダブルGETの原因はAndroidダウンロードマネージャーであると想定しています。

この説明がお役に立てば幸いです。

10
StevePayne

私が Androidからファイルをダウンロードする で書いたように:

Androidブラウザは、ボタンの[イベントを投稿]でファイルをダウンロードしません。ポストイベントでは、ファイルは.htmガベージファイルになります。これを克服するには、次のようにします。

ダウンロードボタンをクリックしてください

 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

私はJspyブログのすべての推奨事項を試しましたが、今のところ何も機能していません。 Content-dispositionはブラウザをダウンロードモードにしますが、ダウンロードが開始されたページのHTML以外は何もダウンロードされません。だから私の結論は、それはグーグルからの純粋なバグであり、グーグルがそれを修正することを祈るだけかもしれない。私の回避策は、コンテンツタイプをAcceptヘッダーフォームのモバイルブラウザーからのタイプに設定することでした。通常は機能し、Zipファイルをテキストとしてダウンロードすることもできます。

0
Dmitriy R

理論的には、filenameパラメータはContent-TypeではなくContent-Dispositionに設定する必要があります。これがAndroidブラウザで役立つかどうかわかりません。

0
Julian Reschke