ユーザーが PDF ファイルをダウンロードできる Web アプリがあります。これは ASP.NET MVC であり、デスクトップ ブラウザー、iPhone、Android Chrome、および Web ビュー setDownloadListener() をオーバーライドするネイティブ Android アプリですべて正常に動作します。
ただし、デフォルトの Android ブラウザーを使用している場合、ダウンロードは機能しないようです。4.2.2 を実行している Galaxy Nexus と 2.3.7 を実行している Nexus S 4g でテストしています。両方のデバイスに PDF ビューア アプリをインストールしています。
Android Chrome でテストすると、ユーザーに「ダウンロードを開始しています...」というトーストが表示され、ステータス バーにダウンロード完了の通知が表示されます。ユーザーはこの通知をタップして、PDF ビューアでファイルを開くことができます。Android の既定のブラウザーでは、トーストは表示されず、ダウンロード ファイルも保存されません。
Wireshark をネットワークに配置すると、次の要求が表示されます。
GET /appapth/ViewPDF/8383600280757433_11_05_2012 HTTP/1.1
Host: 192.168.1.117
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
X-Requested-With: com.google.android.browser
User-Agent: Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Galaxy Nexus Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Accept-Encoding: gzip,deflate
Accept-Language: en-US
Accept-Charset: utf-8, iso-8859-1, utf-16, *;q=0.7
Cookie: (lots o'cookie data)
応答は次のとおりです。
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: application/pdf
Content-Encoding: gzip
Expires: -1
Server: Microsoft-IIS/7.5
Set-Cookie: ___TempData=; path=/
Set-Cookie: ___TempData=(lot's o'cookie data); path=/; HttpOnly
Date: Mon, 01 Apr 2013 18:22:20 GMT
Content-Length: 48244
......YQ.....T...?J.h)...!E.S(lots o'binary data)
トレースからわかるように、application/pdf コンテンツがダウンロードされます。また、content-disposition ヘッダーを使用しておらず、応答が gzip エンコーディングでダウンロードされていることもわかります。
これがデフォルトの Android ブラウザーで機能しない理由について何か考えはありますか? ユーザーはダウンロードしたデータにアクセスできず、ビューアー (またはインテント) は起動されません。応答は黙って無視されます。(Android の既定のブラウザーでは content-disposition が必要か、ダウンロード時に Gzip が気に入らないのではないかと推測していますが、推測にすぎません)
アップデート - -
Gzip 圧縮を実装していたアクション フィルターを削除し、Content-Disposition 添付ヘッダーに追加しました。したがって、コントローラーの MVC コードは次のようになります。
public virtual ActionResult ViewPDF(string id)
{
try
{
byte[] pdf = GetPDFContent(id);
FileContentResult fcr = new FileContentResult(pdf, "application/pdf");
fcr.FileDownloadName = id + ".pdf";
return fcr;
}
HTTP 応答は次のようになります。
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: application/pdf
Expires: -1
Server: Microsoft-IIS/7.5
Content-Disposition: attachment; filename=433_07_05_2012.pdf
Set-Cookie: ___TempData=; path=/
Set-Cookie: ___TempData=(lots o'cookie data);path=/; HttpOnly
Date: Mon, 01 Apr 2013 19:56:07 GMT
Content-Length: 59069
%PDF-1.3 %.... 13 0 obj << (lots o'binary pdf data)
gzip はなくなり、content-disposition がありますが、Android のデフォルト ブラウザではまだ目に見えるダウンロードはありません。
更新 2 ---
https://stackoverflow.com/a/5728859/90236およびhttp://winzter143.blogspot.com/2012/03/android-handling-of-content-disposition.htmlおよびhttp://androidforumsからの提案を試しました。 com/application-development/256987-android-phone-download-issue-asp-net-website.htmlでも同じ結果が得られます。