您的位置:首页 > 其它

关于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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: