asp.net中下载文件的问题
今天解决web的文件下载问题,下载的方法网上很多,不过我的下载有点特殊:
1、下载按钮在gridview中,是模板列的linkButton;
2、使用了ajax控件;
所以,在下载时总是报错,通过查找资料,解决方法如下:
1、先说ajax控件的问题:
如果下载按钮在ajax控件上,需要添加Triggers节点,如下:
aspx:
<asp:UpdatePanel ID="UpdatePanel3" runat="server">
<ContentTemplate>
<asp:Button ID="btnImportModel" Text="导入模板" runat="server" CssClass="buttonSkin" onclick="btnImportModel_Click"/>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="btnImportModel" />
</Triggers>
</asp:UpdatePanel>
aspx.cs:
protected void btnImportModel_Click(object sender, EventArgs e)
{
//服务器的路径地址文件夹,在根目录对应的文件相关的FileTempletModel下;如本系统的生成的文件在(根目录-MenuWFrm-JCSZ)下的FileTempletModel里
string savePath = HttpContext.Current.Server.MapPath("FileTempletModel");
if (!System.IO.Directory.Exists(savePath))
{//如果没有文件夹,则建立
System.IO.Directory.CreateDirectory(savePath);
}
savePath = savePath + "\\" + row.Cells[2].Text + ".xml";//服务器上的文件名称:文件夹路径 + 模板名称 + 后缀名(.xml)
DataSet ds = bllTemplet.ExportModelForDS(templetID);//获取数据
ds.WriteXml(savePath);//数据导出到文件中(服务器上)
GC.Collect();
string filePath = savePath;//+ ".xml";//服务器上的文件名称,用于从服务器下载到客户端上
if (System.IO.File.Exists(filePath))
{//将服务器上的文件下载到客户端上
System.IO.FileInfo file = new System.IO.FileInfo(filePath);
Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8"); //解决中文乱码
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(file.Name)); //解决中文文件名乱码
Response.AddHeader("Content-length", file.Length.ToString());//下载时显示进度条
Response.ContentType = "appliction/octet-stream";
/* 微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite 下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。 代码如下: */
Response.TransmitFile(filePath, 0, file.Length); //这个路径是在根目录下
Response.Flush();
Response.End();
}
}
单击按钮的事件没有变化,仅仅需要在前台UpdatePanel中添加上Triggers节点,将按钮的ID存放进即可。
2、gridview中的模板列中按钮的问题:
在gridview中的模板列使用下载按钮,有一个问题,那就是无法找到该按钮ID,那么Triggers节点中就无法保存,这样点击下载报错。解决方法如下:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="gv_show" runat="server" onrowcommand="gv_show_RowCommand" onrowcreated="gv_show_RowCreated">
<Columns>
<asp:TemplateField HeaderText="操作">
<ItemStyle HorizontalAlign="center" Width="10%"></ItemStyle>
<ItemTemplate>
<asp:LinkButton ID="btn_ExportModel" runat="server" BackColor="Transparent" BorderStyle="None"
CommandName="b_exportModel" ForeColor="#3a6ea5" Text="导出" OnInit="btn_ExportModel_Init"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
aspx.cs:
protected void btn_ExportModel_Init(object sender, EventArgs e)
{//不知道做什么用,但是没这段话,无法执行下载操作
ScriptManager scriptManager = (ScriptManager)((Page)HttpContext.Current.Handler).FindControl("ScriptManager1");//获取父页面ScriptManager1控件
scriptManager.RegisterPostBackControl((Control)sender);
//从结果来看,该方法是为了给Triggers中的PostBackTrigger赋值
}
按钮的方法和正常一样,没什么变化:
protected void gv_show_RowCommand(object sender, GridViewCommandEventArgs e)
{
int num = int.Parse(e.CommandArgument.ToString());
GridViewRow row = this.gv_show.Rows[num];
string templetID = this.gv_show.DataKeys[num]["GLVCHTempletID"].ToString().Trim();//主键
if (e.CommandName == "b_exportModel")
{
#region//导出模板
//服务器的路径地址文件夹,在根目录对应的文件相关的FileTempletModel下;如本系统的生成的文件在(根目录-MenuWFrm-JCSZ)下的FileTempletModel里
string savePath = HttpContext.Current.Server.MapPath("FileTempletModel");
if (!System.IO.Directory.Exists(savePath))
{//如果没有文件夹,则建立
System.IO.Directory.CreateDirectory(savePath);
}
savePath = savePath + "\\" + row.Cells[2].Text + ".xml";//服务器上的文件名称:文件夹路径 + 模板名称 + 后缀名(.xml)
DataSet ds = bllTemplet.ExportModelForDS(templetID);//获取数据
ds.WriteXml(savePath);//数据导出到文件中(服务器上)
GC.Collect();
string filePath = savePath;//+ ".xml";//服务器上的文件名称,用于从服务器下载到客户端上
if (System.IO.File.Exists(filePath))
{//将服务器上的文件下载到客户端上
System.IO.FileInfo file = new System.IO.FileInfo(filePath);
Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8"); //解决中文乱码
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(file.Name)); //解决中文文件名乱码
Response.AddHeader("Content-length", file.Length.ToString());//下载时显示进度条
Response.ContentType = "appliction/octet-stream";
//Response.ContentType = "application/x-zip-compressed";
//Response.WriteFile(file.FullName);
/* 微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite 下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。 代码如下: */
Response.TransmitFile(filePath, 0, file.Length); //这个路径是在根目录下
Response.Flush();
Response.End();
}
#endregion
}
}
protected void gv_show_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
LinkButton btn = (LinkButton)e.Row.FindControl("btn_ExportModel");
if (btn != null)
{//导出模板
btn.CommandArgument = e.Row.RowIndex.ToString();
}
}
}
综上,可以看出下载的方法还是常见的方法,但是在使用ajax的UpdatePanel后,需要添加:
<Triggers>
<asp:PostBackTrigger ControlID="btnExport" />
</Triggers>
如果是在gridview中使用下载按钮,需要想办法找到该按钮的ID,并实现asp:PostBackTrigger赋值
asp.net中下载文件的问题的更多相关文章
- .net中下载文件的方法(转)
.net中下载文件的方法 一.//TransmitFile实现下载 protected void Button1_Click(object sender, EventArgs e) ...
- ASP.NET中的文件上传大小限制的问题
一.文件大小限制的问题 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文 ...
- VSTO学习笔记(四)从SharePoint 2010中下载文件
原文:VSTO学习笔记(四)从SharePoint 2010中下载文件 上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程.本次我们来给CO ...
- js中使用showModelDialog中下载文件的时候,闪一下后无法下载
在js中使用showModelDialog中下载文件的时候,会因为showModelDialog自动设置target为_self导致下载文件“只会闪一下”就消失掉 在吧target设置为_blank后 ...
- django 中下载文件与下载保存为excel
一.django 中下载文件 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍dja ...
- SpringMVC实现从磁盘中下载文件
除了文件的上传我们还需要从磁盘下载 实现文件的下载只要编写一个控制器,完成读写操作和响应头和数据类型的设置就可以了 下面演示的是从G盘imgs文件夹中下载文件 具体代码如下 package com.c ...
- java 从网络Url中下载文件 (转)
http://blog.csdn.net/xb12369/article/details/40543649/ /** * 从网络Url中下载文件 * @param urlStr ...
- 使用curl在命令行中下载文件
http://m.blog.csdn.net/blog/mayadong7349/7019208 使用curl在命令行中下载文件 linux下curl简单应用详解 http://blog.sina.c ...
- asp.net mvc5 下载文件方法
控制器自带的 FileContentResult 可以让我们很方便的返回文件到服务端,减少了很多步骤.用于下载文件的时候,像视频.文本.图片这种浏览器支持的文件,默认就会被浏览器打开.这时候想让它变成 ...
随机推荐
- VHDL学习札记:library and Package
参考:http://www.cnblogs.com/garylee/archive/2012/11/16/2773596.htmlhttp:// http://forums.xilinx.com ...
- POJ C++程序设计 编程作业—类和对象 编程题#1
编程题#1 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面程序输出的结 ...
- Linux安装配置php环境的方法
本文实例讲述了Linux安装配置php环境的方法.分享给大家供大家参考,具体如下: 1.获取安装文件: http://www.php.net/downloads.php php-5.3.8.tar.g ...
- 使用notiy和wait模拟阻塞队列
public class MyQueue { //定义一个存储数据的容器 private LinkedList<Object> list = new LinkedList<Objec ...
- Pull解析xml
没有写抛出的异常,例子是含有多个Person对象persons.xml(此片内容未写写入的代码),包含id,name,email,address标签,Person对象含有id,name,email,a ...
- 用序列化工具写入xml
标本: <?xml version="1.0" encoding="UTF-8" standalone="true"?> //文 ...
- SQL Server 基础:子查询
1.子查询的概念:子查询就是嵌套在主查询中的查询.子查询可以嵌套在主查询中所有位置,包括SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY.2.子查询的分类:2.1按 ...
- 可以获取get post url 传递参数的统一方法
public static string objRequest(string requestName) { object obj = HttpContext.Current.Request[reque ...
- Requests:Python HTTP Module学习笔记(一)(转)
Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...
- 推荐一个sqlce,sqllite等数据库管理工具
推荐一个sqlce,sqllite等数据库管理工具 下载地址: http://fishcodelib.com/files/DatabaseNet4.zip 支持sqlserver,sqlce, sql ...