C# ASP.NET 3.5表单中未下载文件扩展名

C# ASP.NET 3.5表单中未下载文件扩展名,c#,filestream,asp.net-3.5,C#,Filestream,Asp.net 3.5,我真的很困惑,因为在一个网站上,我的代码工作得很好,而在另一个网站上,却没有 文件下载时没有扩展名,但当我重命名下载的文件以包含扩展名(我将.pdf添加到文件名中)时,它会以pdf格式正确打开。我100%确信字节和文件名是正确的,文件名是report.pdf 以下是原始代码: private void downloadByteStreamAsFile(Byte[] bytes, String fileName) { System.Web.HttpResponse

我真的很困惑,因为在一个网站上,我的代码工作得很好,而在另一个网站上,却没有

文件下载时没有扩展名,但当我重命名下载的文件以包含扩展名(我将
.pdf
添加到文件名中)时,它会以pdf格式正确打开。我100%确信
字节
文件名
是正确的,
文件名
report.pdf

以下是原始代码:

    private void downloadByteStreamAsFile(Byte[] bytes, String fileName)
    {
        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
        response.Clear();

            //response.Flush(); //comment this or else no file returned
            response.AddHeader("Content-Type", "binary/octet-stream");
            response.AddHeader("Content-Disposition",
                "attachment; filename=" + fileName + "; size=" + bytes.Length.ToString());

            response.BinaryWrite(bytes);
            response.Flush();
            response.End();

        }
    }
我还尝试:

  • 使用输出流
  • 删除
    内容处置
  • “附件;文件名=“+filename+”.PDF;大小=“+bytes.Length.ToString())
    (因此现在该文件应命名为
    report.pdf.pdf
    ,但仍仅命名为
    report
请帮忙


更新:代码在IE和Chrome中运行良好,只有Firefox存在丢失文件扩展名的问题

尝试将文件名加引号

response.AddHeader(
    "Content-Disposition",
    "attachment; filename=\"" + fileName + "\"; size=" + bytes.Length.ToString());`

如果这样做有效,那么看看这对IE、Chrome和Safari是否仍然有效。如果没有,请添加
If
语句以有条件地添加引号。

尝试将文件名放在引号中

response.AddHeader(
    "Content-Disposition",
    "attachment; filename=\"" + fileName + "\"; size=" + bytes.Length.ToString());`

如果这样做有效,那么看看这对IE、Chrome和Safari是否仍然有效。如果没有,请添加一个
If
语句来有条件地添加引号。

这让我陷入了一个真正的循环,但结果是只有PDF文件没有正确下载,这是因为设置了
内容类型。我可能可以用不同的方式重构代码,但我最喜欢用这种方式编码,因为它对我来说最容易理解和调试。以下是我的固定方法:

    private void downloadByteStreamAsFile(Byte[] bytes, String fileName)
    {
        fileName = fileName.Replace(" ", "_");

        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
        response.Clear();

       if( fileName.Contains(".pdf")){
            fileName = HttpUtility.UrlEncode(fileName);
            //response.Flush(); //comment this or else no file returned
            response.AddHeader("Content-Type", "application/pdf");
            response.AddHeader("Content-Disposition",
                "attachment; filename=" + fileName + "; size=" + bytes.Length.ToString());

            response.BinaryWrite(bytes);
            response.Flush();
            response.End();
        } else {
            //response.Flush(); //comment this or else no file returned
            response.AddHeader("Content-Type", "binary/octet-stream");
            response.AddHeader("Content-Disposition",
                "attachment; filename=" + fileName + "; size=" + bytes.Length.ToString());

            response.BinaryWrite(bytes);
            response.Flush();
            response.End();

        }
    }

这让我陷入了一个真正的循环,但结果证明只有PDF文件没有被正确下载,这是因为设置了
内容类型。我可能可以用不同的方式重构代码,但我最喜欢用这种方式编码,因为它对我来说最容易理解和调试。以下是我的固定方法:

    private void downloadByteStreamAsFile(Byte[] bytes, String fileName)
    {
        fileName = fileName.Replace(" ", "_");

        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
        response.Clear();

       if( fileName.Contains(".pdf")){
            fileName = HttpUtility.UrlEncode(fileName);
            //response.Flush(); //comment this or else no file returned
            response.AddHeader("Content-Type", "application/pdf");
            response.AddHeader("Content-Disposition",
                "attachment; filename=" + fileName + "; size=" + bytes.Length.ToString());

            response.BinaryWrite(bytes);
            response.Flush();
            response.End();
        } else {
            //response.Flush(); //comment this or else no file returned
            response.AddHeader("Content-Type", "binary/octet-stream");
            response.AddHeader("Content-Disposition",
                "attachment; filename=" + fileName + "; size=" + bytes.Length.ToString());

            response.BinaryWrite(bytes);
            response.Flush();
            response.End();

        }
    }

如果有人在Windows Server 2008 R2上使用IIS 7.5,请按照下面的代码段进行操作

该代码跨浏览器工作,并处理chrome browser>51更新的“网络故障错误”

     // CSV Generic List    
         CSVExportGeneric<BookFxDownload> _csv = new CSVExportGeneric<BookFxDownload>(Download);
            // Convert to byte array
                                byte[] a = _csv.ExportToBytes().ToArray();
    // the lines are supposed to be in the same order
                                Response.Clear();
                                Response.Buffer = true;
                                Response.ClearHeaders();
                                Response.ClearContent();

                                //Response.AppendHeader("content-disposition", fileName);
                                Response.ContentType = "application/csv";
                                Response.AddHeader("Content-Length", a.Length.ToString());
//fileName = <yourname>.<extension>
                                Response.AppendHeader("content-disposition", "attachment; filename=" +"\"" + fileName + "\"");
                                Response.Charset = "";
                                Response.OutputStream.Write(a, 0, a.Length);
                                Response.Flush();
                                Response.Close();
//CSV通用列表
CSVExportGeneric _csv=新的CSVExportGeneric(下载);
//转换为字节数组
字节[]a=_csv.ExportToBytes().ToArray();
//这些线应该是按相同的顺序排列的
Response.Clear();
Response.Buffer=true;
Response.ClearHeaders();
Response.ClearContent();
//AppendHeader(“内容处置”,文件名);
Response.ContentType=“应用程序/csv”;
AddHeader(“Content-Length”,a.Length.ToString());
//文件名=。
Response.AppendHeader(“内容处置”、“附件;文件名=“+”\”“+filename+”\”);
响应。Charset=“”;
Response.OutputStream.Write(a,0,a.Length);
Response.Flush();
Response.Close();

如果有人在Windows Server 2008 R2上使用IIS 7.5,请按照下面的代码片段操作

该代码跨浏览器工作,并处理chrome browser>51更新的“网络故障错误”

     // CSV Generic List    
         CSVExportGeneric<BookFxDownload> _csv = new CSVExportGeneric<BookFxDownload>(Download);
            // Convert to byte array
                                byte[] a = _csv.ExportToBytes().ToArray();
    // the lines are supposed to be in the same order
                                Response.Clear();
                                Response.Buffer = true;
                                Response.ClearHeaders();
                                Response.ClearContent();

                                //Response.AppendHeader("content-disposition", fileName);
                                Response.ContentType = "application/csv";
                                Response.AddHeader("Content-Length", a.Length.ToString());
//fileName = <yourname>.<extension>
                                Response.AppendHeader("content-disposition", "attachment; filename=" +"\"" + fileName + "\"");
                                Response.Charset = "";
                                Response.OutputStream.Write(a, 0, a.Length);
                                Response.Flush();
                                Response.Close();
//CSV通用列表
CSVExportGeneric _csv=新的CSVExportGeneric(下载);
//转换为字节数组
字节[]a=_csv.ExportToBytes().ToArray();
//这些线应该是按相同的顺序排列的
Response.Clear();
Response.Buffer=true;
Response.ClearHeaders();
Response.ClearContent();
//AppendHeader(“内容处置”,文件名);
Response.ContentType=“应用程序/csv”;
AddHeader(“Content-Length”,a.Length.ToString());
//文件名=。
Response.AppendHeader(“内容处置”、“附件;文件名=“+”\”“+filename+”\”);
响应。Charset=“”;
Response.OutputStream.Write(a,0,a.Length);
Response.Flush();
Response.Close();

尝试使用
response.AddHeader(“内容类型”、“应用程序/pdf”)
@Lashane:(不,没有帮助。但我确实发现这是firefox Only的可能副本,这里是答案尝试使用
response.AddHeader(“内容类型”,“应用程序/pdf”);
@Lashane:(不,没有帮助。但我确实发现这是firefox Only的可能副本,这里是答案