4

IIS ASP.NET Webアプリケーションを介してPDF(およびその他の種類ですがPDFに焦点を当てることができます)をダウンロードしています。ダウンロードは、iPadおよびiPhone4SのSafariを除く他のすべてのプラットフォームで機能します。iOSがドキュメントのダウンロードをサポートしていないことは知っていますが、SafariもPDFを開きません。リンクをクリックしても、デバイスで応答がありません。私は以下にリストされているいくつかの解決策を試しました(主にヘッダーを取り出し/交換します):

http://nilangshah.wordpress.com/2007/05/28/successfully-stream-a-pdf-to-browser-through-https/および PHP:ダウンロードファイルスクリプトがiPadで機能しない

「予期されたMIME」タイプ以外のエラーはデバイスに表示されませんが、デスクトップブラウザーのバージョンでもエラーが表示され、ダウンロードが停止しません。プロキシを実行していますが、デバイスが適切なヘッダーで200応答を受信して​​いることがわかります。デバイスを使用して他のサイトからPDFを正常に開くことができました。

私はASPとiOSに精通し始めたばかりなので、デバッグに関する洞察もいただければ幸いです。

コードは次のようになります。

context.Response.Buffer = false;
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.ClearContent();

context.Response.ContentType = "application/pdf";

string fileName = "thefile.pdf";

System.Web.HttpBrowserCapabilities browser = context.Request.Browser;
//I have tried with and without all the possbilities in the condition below
if (!browser.Browser.Equals("iPad"))
{
    if (isDownload || viewers.Length == 0)
        context.Response.AppendHeader("Content-Disposition",
                                      string.Format("attachment; filename=\"{0}\"", fileName));
    else
        context.Response.AppendHeader("Content-Disposition", "filename=" + fileName);   
}else
{
    //context.Response.AppendHeader("Content-Disposition", string.Format("inline; filename=\"{0}\"", fileName));
}

FileStream iStream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
long fileSize = iStream.Length;
long fileLengthToRead = fileSize;
int chunckSize = 10000;
byte[] buffer = new byte[chunckSize];

context.Response.AppendHeader("Content-Length", fileSize.ToString());
context.Response.AppendHeader("X-Content-Type-Options", "nosniff");

try
{
    while (fileLengthToRead > 0 && context.Response.IsClientConnected)
    {
        int read = iStream.Read(buffer, 0, chunckSize);
        context.Response.OutputStream.Write(buffer, 0, read);
        context.Response.Flush();
        fileLengthToRead = fileLengthToRead - read;
    }
}
catch (HttpException) { }
finally
{
    iStream.Close();
    iStream.Dispose();
}
break;

そして、ヘッダーは次のようになります。

GET http://sample.com/sample.pdf HTTP/1.1
Host: sample.com
Accept-Encoding: gzip, deflate
Accept-Language: en-us
User-Agent: Mozilla/5.0 (iPad; U; CPU OS 4_3_4 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8K2 Safari/6533.18.5
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Referer: http://sample.com/sample.aspx

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 218882
Content-Type: application/pdf
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 01 Aug 2012 15:41:06 GMT
4

0 に答える 0