1

ユーザーが選択した内容に応じて、Crystal Report のコンテンツを PDF または Excel ドキュメントに書き込める Web フォーム ページがあります。

2 つの問題があります。

  1. .pdf と .xls の両方の拡張子の場合、拡張子 IE に追加されるブラケットが内側に 1 つ付いています: fileName.xls' 1 '

  2. ユーザーが Excel ドキュメントを選択すると、IE でファイルのダウンロード プロンプトが表示され、ファイルを保存するか開くかを尋ねられます。

ここに画像の説明を入力

PDFファイルは問題なく保存されますが、Excelファイルを開くことを選択すると、エクスプローラーウィンドウが開き、ゴミが表示されます...

コードは次のとおりです。

try
{
    permission = new FileIOPermission(FileIOPermissionAccess.Read, output);
    fs = File.Open(output, FileMode.Open, FileAccess.Read);
    byte[] byteArray = new byte[fs.Length];
    fs.Read(byteArray, 0, (int)fs.Length);
    fs.Close();
    fs.Dispose();
    Response.Clear();
    Response.ClearHeaders();
    Response.ClearContent();
    fileName = fileName + '.' + extn;
    //Response.AddHeader("Content-Disposition", "attachments;filename=\"" + fileName + ".\"" + extn);
    Response.AddHeader("Content-Disposition", "attachments;filename=\"" + fileName + "\"");
    Response.AddHeader("Content-Length", byteArray.Length.ToString());

    switch ("." + extn)
    {
        case ".pdf":
            Response.AppendHeader("Content-Type", "application/pdf");
            break;
        case ".xls":
            //Response.ContentType = "application/vnd.ms-excel";
            //Response.ContentType = "application/octet-stream";
            Response.AppendHeader(".xls", "application/excel");
            //Response.AppendHeader("Content-Type", "application/vnd.ms-excel");
            //Response.AppendHeader("Content-Type", "application/force-download");

            break;
        case ".txt":
            Response.AppendHeader("Content-Type", "application/notepad");
            break;

    }
    FileInfo info = new FileInfo(output);
    info.Delete();
    Response.BinaryWrite(byteArray);
    Response.Flush();
    Response.End();
}
catch (Exception ex)
{

    if (fs != null)
        fs.Close();
}

「 1 」が拡張機能に追加されたという現象を調査してきましたが、それについてはあまり発見されておらず、コードをデバッグして、拡張機能がクリーンであることを確認しました。

私の次の推測は、Response.BinaryWrite(byteArray); で何かが起こっていることです。行または MIME タイプまたはコンテンツ ヘッダー...

ご協力ありがとうございます

ダグ

4

2 に答える 2

0

switch次のように拡張します。

switch ("." + extn)
{
    // case ".pdf":
    // ...

    default:
        throw new NotImplementedException();
}

例外がスローされた場合、何が問題なのかについてのヒントが得られる可能性があります。

于 2013-04-14T12:46:15.960 に答える
0

私は自分のプロジェクトで同様のことをしました。以下に使用したコードを貼り付けました。私は、あなたが行を置き換えるだけだと思います。Response.AppendHeader(".xls", "アプリケーション/Excel"); Response.ContentType = "アプリケーション/Excel";

string name = Path.GetFileName(path);
        string ext = Path.GetExtension(path);
        string type = "";
        // set known types based on file extension 
        if (ext != null)
        {
            switch (ext.ToLower())
            {
                case ".htm":
                case ".html":
                    type = "text/HTML";
                    break;


                case ".txt":
                    type = "text/plain";
                    break;


                case ".doc":
                case ".docx":
                case ".rtf":
                    type = "Application/msword";
                    break;

                case ".pdf":
                    type = "application/pdf";
                    break;

                case ".csv":
                case ".xlsx":
                    type = "application/vnd.ms-excel";
                    break;
            }
        }
        Response.AppendHeader("content-disposition",
            "attachment; filename=" + name);
        if (string.IsNullOrEmpty(type))
        {

        }
        else
        {
            Response.ContentType = type;
        }
        Response.WriteFile(path);
        Response.End();
于 2013-04-14T01:39:34.060 に答える