今天解决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中下载文件的问题的更多相关文章

  1. .net中下载文件的方法(转)

    .net中下载文件的方法 一.//TransmitFile实现下载      protected void Button1_Click(object sender, EventArgs e)      ...

  2. ASP.NET中的文件上传大小限制的问题

    一.文件大小限制的问题 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文 ...

  3. VSTO学习笔记(四)从SharePoint 2010中下载文件

    原文:VSTO学习笔记(四)从SharePoint 2010中下载文件 上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程.本次我们来给CO ...

  4. js中使用showModelDialog中下载文件的时候,闪一下后无法下载

    在js中使用showModelDialog中下载文件的时候,会因为showModelDialog自动设置target为_self导致下载文件“只会闪一下”就消失掉 在吧target设置为_blank后 ...

  5. django 中下载文件与下载保存为excel

    一.django 中下载文件 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍dja ...

  6. SpringMVC实现从磁盘中下载文件

    除了文件的上传我们还需要从磁盘下载 实现文件的下载只要编写一个控制器,完成读写操作和响应头和数据类型的设置就可以了 下面演示的是从G盘imgs文件夹中下载文件 具体代码如下 package com.c ...

  7. java 从网络Url中下载文件 (转)

    http://blog.csdn.net/xb12369/article/details/40543649/ /**       * 从网络Url中下载文件       * @param urlStr ...

  8. 使用curl在命令行中下载文件

    http://m.blog.csdn.net/blog/mayadong7349/7019208 使用curl在命令行中下载文件 linux下curl简单应用详解 http://blog.sina.c ...

  9. asp.net mvc5 下载文件方法

    控制器自带的 FileContentResult 可以让我们很方便的返回文件到服务端,减少了很多步骤.用于下载文件的时候,像视频.文本.图片这种浏览器支持的文件,默认就会被浏览器打开.这时候想让它变成 ...

随机推荐

  1. vue.js笔记

    一.v-bind 缩写 <!-- 完整语法 --> <a v-bind:href="url"></a> <!-- 缩写 --> &l ...

  2. Operation is not valid due to the current state of the object.

    今天遇到一个asp.net的草郁闷的问题,看下截图 狂晕啊,在google上狂搜了一下,好在已经有大侠也遇到过这个问题了,先看下别人的解决办法吧 Operation is not valid due ...

  3. centos查看设置端口开放状态

    centos查看端口是否已开放/etc/init.d/iptables status centos开放端口/sbin/iptables -I INPUT -p tcp --dport 8000 -j ...

  4. Cassandra 数据模型 (基于CQL,解决胖列数量限制及灵活性问题)(1.1及以上版本)

    文中主要交代Cassandra的编程模型及数据结构. 由于Cassandra版本数次更新,网上中文的资料已经有点过时,比较有代表性的比如ebuy那篇文章都已经过时了,于是自己找资料,结合官方博客写一篇 ...

  5. ThinkPHP常用变量

    __ROOT__  : 网站根目录地址 __APP__  : 当前项目(入口文件)地址 __GROUP__:当前分组地址 __URL__  : 当前模块地址 __ACTION__ : 当前操作地址 _ ...

  6. (转)Arcgis API常用接口调用方法

    var map, navToolbar, editToolbar, tileLayer, toolbar;//var mapBaseUrl = "http://localhost:8399/ ...

  7. 对话框AlertDialog的基本类型与创建

    测试代码: 布局: activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...

  8. 在xml中添加array

    在values建立arrays(名字可自定义)的xml: <?xml version="1.0" encoding="utf-8"?> <re ...

  9. jsonp 调用天气API

    由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯 ...

  10. 【原创】StickHeaderListView的简单实现,解决footerView问题

    1.前言: 前几天用了GitHub上se.emilsjolander.stickylistheaders这个组件,然后发现这个组件的listview不能添加footerView,加了footer后,滑 ...