1

私はiTextSharpを使用してPDFレポート(ファイル)を作成し、それらをアプリケーションが存在するWebサーバーに保存しています。ファイルを作成し、ストレージフォルダーに移動して、問題なくファイルを開くことができます。注意:ユーザーは、作成時にファイルを自動的にダウンロードすることはできません。

ボタンを使用してサーバーから「古い」レポートをダウンロードするオプションをユーザーに提供したいと思います。これはIE(10)では正常に機能しますが、ChromeとFirefoxでは機能しません。常にエラーメッセージが表示されます:このドキュメントを開くときにエラーが発生しました。ファイルが破損しているため、修復できませんでした。

この画像ボタンがあり、クリックすると、この投稿に従って(私のページには更新パネルが含まれているため)ユーザーを汎用ハンドラーに送信します(現時点では部分的にのみ使用しています)。

これは、実際にファイルをダウンロードするコードです。

 public void ProcessRequest(HttpContext context)
    {
        var _fileName = context.Request.QueryString["fileName"];

        using (var _output = new MemoryStream())
        {
            //var _fileSeverPath = context.Server.MapPath(_fileName);
            context.Response.Clear();
            context.Response.ContentType = "application/pdf";// "application/pdf";
            //context.Response.AppendHeader("Content-Length", _fileName.Length.ToString());
            context.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename=" + Path.GetFileName(_fileName)));

            context.Response.WriteFile(_fileName);
            context.Response.Flush();
            context.Response.Close();
            context.Response.End();
        }
    }

私が言ったように、これはIEでは正常に機能しますが、ChromeとFirefoxでは機能しません。メモ帳でファイルを開くと、ChromeとFirefoxにダウンロードしたときにファイルの約1/3しか取得されないことがわかります。

任意の提案をいただければ幸いです。数日間これを解決しようとしています。

4

2 に答える 2

0

わかりました、最終的に..私は解決策を見つけましたが、同時にばかのように感じます.. context.Response.Close(); を削除しました。...その後、すべてが完全に機能しました:)

于 2013-02-04T20:10:29.563 に答える
0

HttpResponse.WriteFile メソッドから(文字列)

このメソッドを大きなファイルで使用すると、メソッドを呼び出すと例外がスローされる場合があります。この方法で使用できるファイルのサイズは、Web サーバーのハードウェア構成によって異なります。詳細については、マイクロソフト サポート技術情報 Web サイトの記事 812406「PRB: Response.WriteFile で大きなファイルをダウンロードできない」を参照してください。

代わりにこれを試してください:

public void ProcessRequest(HttpContext context)
{
    var _fileName = context.Request.QueryString["fileName"];
    context.Response.Clear();
    context.Response.Buffer = true;
    context.Response.ContentType = "application/pdf";
    context.Response.AppendHeader(
        "Content-Disposition",
        string.Format("attachment; filename=" + Path.GetFileName(_fileName)));

    using (var fs = new FileStream(_fileName, FileMode.Open, FileAccess.Read))
    {
        using (var sr = new StreamReader(fs, true))
        {
            int length = (int)fs.Length;
            byte[] buffer;

            using (BinaryReader br = new BinaryReader(fs, sr.CurrentEncoding))
            {
                buffer = br.ReadBytes(length);
                context.Response.BinaryWrite(buffer);
            }
        }
    }
    context.Response.Flush();
    context.Response.Close();
    context.Response.End();
}
于 2013-01-31T20:28:53.950 に答える