关于updatepanel里面的下载文件 Response
2012-12-05 08:50
411 查看
转自:http://blog.sina.com.cn/s/blog_3f2945490100gwwu.html
几天前碰到个问题,具体如下:
<asp:UpdatePanel ID="udp1" runat="server" UpdateMode="Conditional" OnLoad="udp1_OnLoad">
<ContentTemplate>
……
一个GridView
其中一个TemplateField中有个Repeater
再其中<ItemTemplate>里面有个LinkButton(点击弹出下载保存窗口)
</ContentTemplate>
</asp:UpdatePanel>
后台代码用WriteFile把文件Write出去,
string disHeader = "Attachment; Filename=\"" + Server.UrlEncode(fileName) + "\"";
Response.AppendHeader("Content-Disposition", disHeader);
Response.ContentType = "APPLICATION/OCTET-STREAM";
Response.WriteFile(url);
Response.Flush();
Response.End();
然后会出现什么脚本错误之类的,不能下载。貌似又是异步的问题……
用window.open一个页面来下载无问题,但是有些类型的文件下载后不能把那个open出来的页面关掉。
无奈,用updatepanel的trigger将GridView添加为PostbackTrigger就搞掂了。(换成那个LinkButton说找不到,-_-!)。
<asp:UpdatePanel ID="udp1" runat="server" UpdateMode="Conditional" OnLoad="udp1_OnLoad">
<ContentTemplate>
……
一个GridView
其中一个TemplateField中有个Repeater
再其中<ItemTemplate>里面有个LinkButton(点击弹出下载保存窗口)
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="gvlist" />
</Triggers>
</asp:UpdatePanel>
之前也碰到个UpdatePanel下FileUpload的问题,不知道是否可用这个来解决,得闲试试……
还有在网上找到的文件下载的一些方法:
方法1、HttpResponse.TransmitFile
方法2、HttpResponse.WriteFile
方法3、HttpResponse.BinaryWrite
方法4、HttpResponse.Redirect
方法1与方法2
相同点:都是通过文件的相对或绝对路径下载文件。
不同点:方法2是一次性将文件读入内存,然后输出给客户端。方法1不在内存中缓冲文件。
但方法1也有一个局限:does not work with UNC-share file paths。UNC (Universal Naming Convention) / 通用命名规则,也叫通用命名规范、通用命名约定。它符合 \servername\sharename 格式,也就是说方法1无法下载网络共享磁盘的文件。(乜东东?唔明!)
例如:
if (filePath.StartsWith(@"\\"))
context.Response.WriteFile(filePath, false);
else
context.Response.TransmitFile(filePath);
方法3
方法3主要是将已有的btye[] 型对象输出到客户端。如果要下载的文件位于数据库等存储介质,那么,读入内存时一般可放于DataTable等对象中,这时就可以直接HttpResponse.BinaryWrite((byte[])dt.Rows[0]["fileContent"])输出。
方法4
方法4主要是通过文件的相对路径下载文件;
以上四个方法,如果下载一个汉字命名且字数超过20个字的文件,方法1不会有问题,使用其它三个方法下载后,如果客户端在提示框中点“打开”将报错,提示文件名过长。
以下为代码:
response.Clear();
response.ClearHeaders();//之前无法关闭页面是否是因为没有Clear掉这个?
response.Buffer = false;
response.AppendHeader("Content-Disposition", "attachment;filename=" + displayName);
response.ContentType = "application/octet-stream";
response.WriteFile(url);
//response.TransmitFile(url);
response.Flush();
response.End();
还有一个用BinaryWrite的:
FileStream fs = new FileStream(filePath, FileMode.Open);
byte[] bytes = new byte[(int)fs.Length];
fs.Read(bytes, 0, bytes.Length);
fs.Close();
Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
Response.AddHeader("Content-Disposition",
"attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
几天前碰到个问题,具体如下:
<asp:UpdatePanel ID="udp1" runat="server" UpdateMode="Conditional" OnLoad="udp1_OnLoad">
<ContentTemplate>
……
一个GridView
其中一个TemplateField中有个Repeater
再其中<ItemTemplate>里面有个LinkButton(点击弹出下载保存窗口)
</ContentTemplate>
</asp:UpdatePanel>
后台代码用WriteFile把文件Write出去,
string disHeader = "Attachment; Filename=\"" + Server.UrlEncode(fileName) + "\"";
Response.AppendHeader("Content-Disposition", disHeader);
Response.ContentType = "APPLICATION/OCTET-STREAM";
Response.WriteFile(url);
Response.Flush();
Response.End();
然后会出现什么脚本错误之类的,不能下载。貌似又是异步的问题……
用window.open一个页面来下载无问题,但是有些类型的文件下载后不能把那个open出来的页面关掉。
无奈,用updatepanel的trigger将GridView添加为PostbackTrigger就搞掂了。(换成那个LinkButton说找不到,-_-!)。
<asp:UpdatePanel ID="udp1" runat="server" UpdateMode="Conditional" OnLoad="udp1_OnLoad">
<ContentTemplate>
……
一个GridView
其中一个TemplateField中有个Repeater
再其中<ItemTemplate>里面有个LinkButton(点击弹出下载保存窗口)
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="gvlist" />
</Triggers>
</asp:UpdatePanel>
之前也碰到个UpdatePanel下FileUpload的问题,不知道是否可用这个来解决,得闲试试……
还有在网上找到的文件下载的一些方法:
方法1、HttpResponse.TransmitFile
方法2、HttpResponse.WriteFile
方法3、HttpResponse.BinaryWrite
方法4、HttpResponse.Redirect
方法1与方法2
相同点:都是通过文件的相对或绝对路径下载文件。
不同点:方法2是一次性将文件读入内存,然后输出给客户端。方法1不在内存中缓冲文件。
但方法1也有一个局限:does not work with UNC-share file paths。UNC (Universal Naming Convention) / 通用命名规则,也叫通用命名规范、通用命名约定。它符合 \servername\sharename 格式,也就是说方法1无法下载网络共享磁盘的文件。(乜东东?唔明!)
例如:
if (filePath.StartsWith(@"\\"))
context.Response.WriteFile(filePath, false);
else
context.Response.TransmitFile(filePath);
方法3
方法3主要是将已有的btye[] 型对象输出到客户端。如果要下载的文件位于数据库等存储介质,那么,读入内存时一般可放于DataTable等对象中,这时就可以直接HttpResponse.BinaryWrite((byte[])dt.Rows[0]["fileContent"])输出。
方法4
方法4主要是通过文件的相对路径下载文件;
以上四个方法,如果下载一个汉字命名且字数超过20个字的文件,方法1不会有问题,使用其它三个方法下载后,如果客户端在提示框中点“打开”将报错,提示文件名过长。
以下为代码:
response.Clear();
response.ClearHeaders();//之前无法关闭页面是否是因为没有Clear掉这个?
response.Buffer = false;
response.AppendHeader("Content-Disposition", "attachment;filename=" + displayName);
response.ContentType = "application/octet-stream";
response.WriteFile(url);
//response.TransmitFile(url);
response.Flush();
response.End();
还有一个用BinaryWrite的:
FileStream fs = new FileStream(filePath, FileMode.Open);
byte[] bytes = new byte[(int)fs.Length];
fs.Read(bytes, 0, bytes.Length);
fs.Close();
Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
Response.AddHeader("Content-Disposition",
"attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
相关文章推荐
- 关于在updatepanel中response失效的解决方法
- 在Update Panel 控件里面添加 File Upload 控件 上传文件
- 在asp.net ajax 1.0 的updatePanel中如何实现文件下载
- UpdatePanel 下载文件
- 在UpdatePanel下点击按钮下载文件没反应的解决方法之一
- 关于在vs.net中的.htm里面添加连接,就会出现下载.ASPX文件的提示?
- updatepanel 中按钮下载文件出错解决
- 关于网页下载FTP里面的文件相关
- 在asp.net ajax 1.0 的updatePanel中如何实现文件下载
- UpdatePanel无法导出下载文件
- 关于delphi中url文件下载编码问题(处理里面含有空格,汉字,字符)
- 【JSP开发】关于下载文件response的设置
- UpdatePanel中关于Response.Write、Response.Redirect和Server.Transfer的解决办法
- FileUpload.PostedFile里面总是空的UpdatePanel(FileUpload.PostedFile always null inside UpdatePanel)
- 使用UpdatePanel时FileUpload失效的问题!【FileUpload上传文件失败】
- 关于集成第三方office的sdk产品,采用servlet方式将数据库表BLOB字段文件下载与二进制文件上传到blob
- RMI:关于RMI文件上传下载的完整例子
- HttpServletResponse-完成文件下载
- 关于下载文件是文件名的空格显示不出来和乱码问题 转
- 2 关于android上下载网络文件大小异常的问题