2

私のサイトには、サーバー上で動的に PDF レポートを生成するページがあり、ユーザーのブラウザには「お待ちください」というメッセージが表示されます。終了後、一意のファイルパスをセッションに配置し、空のバーである download.aspx を開きます。これは、page_load 関数の次の c# コードです。

    string fileUID = (string)(Session["fileUID"]);
        string FilePath = @fileUID;
        byte[] fileBytes = System.IO.File.ReadAllBytes(FilePath);
        string sFileName = "Report.pdf";

        System.Web.HttpContext context = System.Web.HttpContext.Current;
        context.Response.Clear();
        context.Response.ClearHeaders();
        context.Response.ClearContent();
        context.Response.AppendHeader("content-length", fileBytes.Length.ToString());
        context.Response.ContentType = "application/octet-stream";
        context.Response.AppendHeader("content-disposition", "attachment; filename=" + sFileName);
        context.Response.BinaryWrite(fileBytes);
        context.Response.Flush();
        System.IO.File.Delete(FilePath);
        context.ApplicationInstance.CompleteRequest();

IE では、ダウンロード ダイアログが表示され、ユーザーはファイルをダウンロードできます。ただし、chrome、firefox、safari では、いつまでもお待ちくださいページにとどまります...

また、PDF ファイルの MIME タイプを指定し、ブラウザ ウィンドウに PDF を表示するために content-disposition を指定しないことも試みましたが、Internet Explorer では完全に機能しますが、他のブラウザでは機能しません。

この問題は、localhost でのテスト時とサーバーへのアップロード時の両方で発生します。

私はこことより広い世界の両方を検索しましたが、同じ問題を抱えている人を他に見つけることができないようです.

誰か私のやり方の間違いを教えてください。

4

3 に答える 3

0

助けてくれてありがとう。

問題はお待ちくださいダイアログページにありました。他のブラウザでデバッグしましたが、window.location(page) が嫌いなので、window.open(page) に変更すると正常に動作します。

どうしてそれを逃したのかわかりません。

于 2013-07-04T08:21:08.787 に答える
0

次のようにファイルを作成するときに、Cookie を設定する必要があります。

 var cookie = new HttpCookie("fileDownloadToken", _token);
                    cookie.Expires = DateTime.Now.AddMinutes(10); 
                    cookie.Path = "/"; //Also set path
                    context.Response.AppendCookie(cookie);

jquery.cookie プラグインを使用した次のページでは、Cookie の値が期待値に設定されている場合に読み取られ、jquery blockui で ui のブロックが解除されます。

<script type="text/javascript">

    var fileDownloadCheckTimer;
    function blockUIForDownload() {
        var token = '1357.11.22'; 
        $('#download_token_value').val(token);
       $.blockUI({
            message:$('#domMessage'),
            css: {
                padding: 10,
                margin: 0,
                width: '30%',
                top: '50%',
                left: '35%',

                textAlign: 'center',
                color: '#000',
                border: '3px solid #aaa',
                backgroundColor: '#fff',
                cursor: 'wait',
            }});
            fileDownloadCheckTimer = window.setInterval(function () {
                var cookieValue = $.cookie('fileDownloadToken');
                //alert(cookieValue);
                if (cookieValue == token)
                    finishDownload();
            }, 1000);
    }

    function finishDownload() {
        window.clearInterval(fileDownloadCheckTimer);
        $.unblockUI();
        $.cookie('fileDownloadToken', null, { path: '/' });

    }

</script>  
于 2013-07-04T08:50:12.807 に答える