我真的很困惑,因为在一个网站上,我的代码完美无缺,而在另一个网站上,它并没有。
文件在没有扩展名的情况下下载,但是当我重命名下载的文件以包含扩展名(我将.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();
}
}
我也尝试过:
Content-Disposition
file extensions lost between browsers in asp.net c# application "attachment; filename=" + fileName + ".PDF; size=" + bytes.Length.ToString());
(现在该文件应命名为report.pdf.PDF
,但它仍然只被命名为report
)请帮忙
更新:代码在IE和Chrome中运行良好,只有Firefox有丢失文件扩展名的问题
答案 0 :(得分:2)
尝试将文件名放在引号中。
response.AddHeader(
"Content-Disposition",
"attachment; filename=\"" + fileName + "\"; size=" + bytes.Length.ToString());`
如果可行,请查看这是否仍适用于IE和Chrome以及Safari。如果没有,请添加if
语句以有条件地添加引号。
答案 1 :(得分:2)
这让我感觉真实,但事实证明只有PDF文件没有被正确下载,这是因为Directory.EnumerateFiles()
被设置了。我可能会以不同的方式重构我的代码,但我最喜欢这样编码,因为这对我来说最容易理解和调试。这是我的固定方法:
Content-Type