文件扩展名不能在ASP中下载.NET 3.5表单

本文关键字:NET 表单 下载 扩展名 不能 ASP 文件 | 更新日期: 2023-09-27 18:06:06

我真的很困惑,因为我的代码在一个网站上运行得很好,而在另一个网站上却不行。

文件下载时没有扩展名,但是当我重命名下载的文件以包含扩展名(我在文件名中添加.pdf)时,它作为PDF正确打开。我100%肯定bytesfilename是正确的,filenamereport.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();
        }
    }

我也试过:

  • 使用输出流试图用asp.net流式传输PDF文件正在生成一个"损坏的文件"
  • 在asp.net c#应用程序中删除Content-Disposition文件扩展名中分号后的空格
  • "attachment; filename=" + fileName + ".PDF; size=" + bytes.Length.ToString());(所以现在文件应该命名为report.pdf.PDF,但它仍然只命名为report)

请帮

更新:代码在IE和Chrome中工作正常,只有Firefox有丢失文件扩展名

文件扩展名不能在ASP中下载.NET 3.5表单

的问题

试着把文件名加引号。

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

如果这有效,然后看看这是否仍然适用于IE和Chrome和Safari。如果没有,请添加if语句来有条件地添加引号。

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

    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();
        }
    }

如果有人正在使用IIS 7.5和Windows Server 2008 R2,请遵循下面的代码片段…

代码跨浏览器工作,并处理"网络失败错误"chrome浏览器> 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();