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 可以让我们很方便的返回文件到服务端,减少了很多步骤.用于下载文件的时候,像视频.文本.图片这种浏览器支持的文件,默认就会被浏览器打开.这时候想让它变成 ...
随机推荐
- [原]hdu2602 Bone Collector (01背包)
本文出自:http://blog.csdn.net/svitter 题意:典型到不能再典型的01背包.给了我一遍AC的快感. //=================================== ...
- POJ C程序设计进阶 编程题#2:四大湖
编程题#2:四大湖 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 我国有4大 ...
- .net框架
转载:http://www.cnblogs.com/JimmyZhang/archive/2012/11/27/2790759.html 本书是一本讲解.NET技术的书籍,目标读者群也是在.NET框架 ...
- C#中的快捷键,可以更方便的编写代码 (转载)
C#中的快捷键,可以更方便的编写代码 CTRL + SHIFT + B 生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O 打开项目 CTRL + ...
- 【php学习之路】字符串操作
无论学习那种语言,字符串操作都是必备的基础.学php的时候总是会不知不觉的与C#比较,用起来总觉得怪怪的没有那么顺手,有些命名也差别很大,再加上很多函数命名是简写形式不百度下还真不知道什 ...
- 2013-10-25笔记,css: mini-width, 标准居中,样式中*号使用,背景图像位置定位
mini-width:设置元素的最小宽度.該屬性值會對元素的寬度設置一個最小限制.因此,元素可以比制定值寬,但不能比制定值窄.不允許指定負值. 完美的居中佈局: body{text-align: ce ...
- IoC~高效的Autofac
http://www.cnblogs.com/lori/archive/2012/09/05/2671724.html http://www.cnblogs.com/kissdodog/p/36114 ...
- Python自然语言工具包(NLTK)入门
在本期文章中,小生向您介绍了自然语言工具包(Natural Language Toolkit),它是一个将学术语言技术应用于文本数据集的 Python 库.称为“文本处理”的程序设计是其基本功能:更深 ...
- Java入门到精通——工具篇之Maven概述
为接手gxpt准备已经快一个月了从SSH2-->EJB-->环境搭建-->Maven的构建.下面就带领大家初始Maven 一.什么是Maven. Maven是一个垮平台的项目管理工具 ...
- [Letcode] 1. Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...