我正在ASP.net中编写一个web应用程序。
我正在尝试创建一个文件对话框,用于从服务器下载内容。
我将相应的文件数据存储在名为file的变量中。
文件包含字段:
FileType - 文件的MIMEType
FilePath - 服务器端文件路径
到目前为止,这是代码:
Response.Clear();
Response.ContentType = file.FileType;
Response.AppendHeader("Content-Disposition", "attachment; filename=" + GetFileName(file));
Response.TransmitFile(file.FilePath) ;
Response.End();
GetFileName是一个从附件对象获取文件名的函数。我只保存路径。
上面的代码位于一个名为“Download_Clicked”的函数中,该函数是一个在点击时触发的事件。该事件映射到LinkButton。
问题是,当我运行上面的代码时,没有任何反应。标准对话框不会出现。
我尝试过标准故障排除,例如确保文件存在,并确保路径正确。他们都死了。
我的猜测是因为我的机器也是服务器,它可能无法正常处理。
提前致谢。
编辑1:尝试将控件放到另一页上,工作正常。
编辑2:通过从AJAX更新面板中删除控件解决了问题。
答案 0 :(得分:3)
我发现了另一个没有删除更新面板的情况。将下面的代码放在页面加载中,您现在可以使用该按钮触发下载。
ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(Button);
答案 1 :(得分:0)
尝试更改
Response.AppendHeader("Content-Disposition", "attachment; filename=" + GetFileName(file));
要
Response.AppendHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(GetFileName(file))));
如果这不起作用,您始终可以使用Response.BinaryWrite或Resonse.Write将文件流式传输到Web浏览器 以下是使用Response.Write或Response.BinaryWrite传输文件的方法。将这些函数放在某个库中,然后根据需要调用它们
public void SendFileToBrowser(String FileName, String MIMEType, String FileData)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName);
Response.ContentType = MIMEType;
Response.Buffer = true;
Response.Write(FileData);
Response.End();
}
public void SendFileToBrowser(String FileName, String MIMEType, Byte[] FileData)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName);
Response.ContentType = MIMEType;
Response.Buffer = true;
Response.BinaryWrite(FileData);
Response.End();
}
然后你可以在某处调用这些函数
SendFileToBrowser("FileName.txt", "text/plain", "Don't try this from an Update Panel. MSAjax does not like it when you mess with the response stream.");
答案 2 :(得分:0)
改为使用Response.WriteFile()
。
另外,请勿使用Response.End()
!这会中止线程。使用Response.Flush(); Response.Close();
答案 3 :(得分:0)
请参阅初始帖子上的编辑。
删除了Ajax Update Panel以解决错误。小组正在将帖子停回服务器。
欲了解更多信息,请参阅Cris Valenzuela的评论。