6

ユーザーが 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でも同じ結果が得られます。

4

1 に答える 1

3

私自身の答えを見つけましたが、それは私が探していた場所よりもはるかに簡単でした. ダウンロードリンクのある私のページはiframeにあります。ダウンロードが iframe で発生した場合、Android の既定のブラウザーで何かが失われます。ダウンロードを開始するタグに target="_blank" を追加したところ、すべて正常に動作するようになりました。

問題と修正方法を示すサンプル コードを次に示します。

<html>
<head><title>Test page</title></head>
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<body>
    <a href="http://www.adobe.com/products/eulas/pdfs/Photoshop_On_a_Server_Policy_5-31-2011.pdf">
        Download sample pdf</a><br />
    <iframe src="inner.html" />
</body>
</html>

とinner.html:

<html>
<head><title>test iframe</title></head>
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<body>
    <p>This does NOT work on Android default browser.
    <a href="http://www.adobe.com/products/eulas/pdfs/Photoshop_On_a_Server_Policy_5-31-2011.pdf">
    Download sample pdf within iframe</a></p>

    <p><a href="http://www.adobe.com/products/eulas/pdfs/Photoshop_On_a_Server_Policy_5-31-2011.pdf"
    target="_blank">Download sample pdf within iframe with target</a>.</p>
</body>
</html>
于 2013-04-02T13:36:31.033 に答える