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的可能副本,这里是答案