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 可以让我们很方便的返回文件到服务端,减少了很多步骤.用于下载文件的时候,像视频.文本.图片这种浏览器支持的文件,默认就会被浏览器打开.这时候想让它变成 ...
随机推荐
- 【转】Linux Kernel __setup(str, fn)解析
__setup这条宏在Linux Kernel中使用最多的地方就是定义处理Kernel的启动参数的函数及数据结构,宏定义如下: #define __setup(str, fn) \ __setup_p ...
- CSS3中颜色线性渐变实战
css3线性渐变可以设置3个参数值:方向.起始颜色.结束颜色.最简单的模式只需要定义起始颜色和结束颜色,起点.终点和方向默认自元素的顶部到底部.下面举例说明: CSS Code复制内容到剪贴板 .te ...
- CentOS 7服务
重启防火墙service firewalld start/restart/stop 使用systemctl来启动/停止/重启服务要启动一个服务,你需要使用如下命令:# systemctl start ...
- Android照相机应用
前言 Android在设计架构的时候,采用了mashup(混搭)的设计理念,也就是说一切都是组建,自己写的是组件,别人提供的也是组件,使用的时候只要符合相关协议就可以把他们当作自己的组件.比如系统提供 ...
- PHP 文件上传服务端及客户端配置参数说明
文件上传服务器端配置: ·file_uploads = On, 支持HTTP上传 ·upload_tmp_dir = , 临时文件保存的目录 ·upload_max_filesize=2M, 允许上传 ...
- Android Material Design:基于CoordinatorLayout实现向上滚动导航条ToolBar滚出、向下滚动导航条滚出
activity_main.xml: <android.support.design.widget.CoordinatorLayout xmlns:android="http://sc ...
- 关于VS2012下安装破解文件Visual Assit X的一点说明
今天在使用Visual Studio 2012的时候,编写代码的助手Visual Assit X突然提示我说,试用期已过,要求我输入一个注册码,我靠,这货不是几个月前已经破解了吗,怎么今天傻不愣登的提 ...
- Android开发之Source无法覆写public void onClick(View v)
初学Android开发,在为一个按钮[该按钮继承OnClickListener()]写监听时,发现无法在Source中引入public void onClick(View v),当时非常纳闷,平常情况 ...
- C#条件编译,发布多平台和多种选择性的项目
http://www.cnblogs.com/chengulv/p/4579528.html 界面操作参考 这样正对不同环境就可以编译出不同的exe或者dll,做到一个项目的灵活多变.条件编译还可以满 ...
- SQL Server 一些关键字详解(一)
1.CROSS APPLY 和OUTER APPLY MSDN解释如下(个人理解不是很清晰): 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数.表值函数作为右输入,外 ...