关于updatepanel里面的下载文件 Response

转自: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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值