文件扩展名不能在ASP中下载.NET 3.5表单
本文关键字:NET 表单 下载 扩展名 不能 ASP 文件 | 更新日期: 2023-09-27 18:06:06
我真的很困惑,因为我的代码在一个网站上运行得很好,而在另一个网站上却不行。
文件下载时没有扩展名,但是当我重命名下载的文件以包含扩展名(我在文件名中添加.pdf
)时,它作为PDF正确打开。我100%肯定bytes
和filename
是正确的,filename
是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();
}
}
我也试过:
- 使用输出流试图用asp.net流式传输PDF文件正在生成一个"损坏的文件"
- 在asp.net c#应用程序中删除
Content-Disposition
文件扩展名中分号后的空格 -
"attachment; filename=" + fileName + ".PDF; size=" + 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
语句来有条件地添加引号。
这让我陷入了一个真正的循环,但事实证明只有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();