【问题标题】:ASP.NET Excel and PDF Download Appending a "[1]" to my .PDF/.XLS ExtensionASP.NET Excel 和 PDF 下载将“[1]”附加到我的 .PDF/.XLS 扩展名
【发布时间】:2013-04-06 07:42:40
【问题描述】:

我有一个 Web 表单页面,它应该能够根据用户所做的选择将 Crystal Report 的内容写入 pdf 或 excel 文档。

我有两个问题:

  1. 对于 .pdf 和 .xls 扩展名,都有一个带 1 的括号 在它里面被附加到扩展IE: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 类型或内容标题...

提前感谢您的帮助

道格

【问题讨论】:

  • 你在哪里设置extn
  • extn = (string)grdReports.DataKeys[rowIndex]["REPORTOUTPUTTYPE"];

标签: asp.net mime-types


【解决方案1】:

我在我的项目中做过类似的事情。 我已经粘贴了我在下面使用的代码。 我想,你只需更换线路。 Response.AppendHeader(".xls", "application/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();

【讨论】:

  • 尝试了这两种方法,但得到了相同的结果。 Response.ContentType = "应用程序/vnd.ms-excel"; Response.ContentType = "应用程序/excel";
【解决方案2】:

将您的switch 扩展到以下内容:

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

    default:
        throw new NotImplementedException();
}

如果抛出异常,这可能会提示您出了什么问题。

【讨论】:

    猜你喜欢
    • 2014-01-25
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2014-11-05
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多