这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法。

先试用Response.WriteFile的方法:

FileInfo fi = new FileInfo(excelFile);//excelFile为文件在服务器上的地址
HttpResponse contextResponse = HttpContext.Current.Response;
contextResponse.Clear();
contextResponse.Buffer = true;
contextResponse.Charset = "GB2312"; //设置了类型为中文防止乱码的出现
contextResponse.AppendHeader("Content-Disposition", String.Format("attachment;filename={0}", excelName)); //定义输出文件和文件名
contextResponse.AppendHeader("Content-Length", fi.Length.ToString());
contextResponse.ContentEncoding = Encoding.Default;
contextResponse.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 contextResponse.WriteFile(fi.FullName);
contextResponse.Flush();
contextResponse.End();

其中第一行的excelFile为Excel文件在服务器上的地址,比如:“C:\Website\Excel\xx.xlsx”。

这种方法也是网上一般提供的方法,但在实际操作中,却出现了意向不到的问题:

在Chrome下

一切正常,Excel文件直接下载到Chrome的默认下载文件夹中。

在Firefox下

由于安装了FlashGot插件,会先选择应用的下载工具:

在这里显示是正常的,如果选择“保存文件”,Excel文件也会被保存到默认文件夹中,但如果试用第三方下载工具,比如迅雷,会出现如下窗口:

注意到网址一栏,会在页面实际地址后添加ViewState信息,而另存名称也不是Excel文件本身的名称,而是页面的名称。

点击确定后,被下载的文件又变成了实际文件(有时会先变成.zip文件,再变为实际文件)

在IE7下

会先弹出保存对话框,文件正常,同样因为装了迅雷的缘故,点保存时,弹出迅雷的下载对话框,和Firefox下不同,网址后面没有ViewState信息。

点确定,下载的则是页面文件:

如果在迅雷的下载对话框中点取消,则会使用IE的下载,这里的文件又是正确的了:

怀疑迅雷是根据下载对话框中的网址重新请求下载,与发起请求的页面已经无关,而IE又不会把ViewState信息传到迅雷中,导致下载的文件不是想要的Excel页面。

之后又尝试了分段下载的方式,其实也是无效的,因为迅雷根本不理会你提供给它的下载机制,而且这样在Firefox下调用迅雷时,由于分段下载的Viewstate并不包含Excel文件的完整信息,迅雷下载下的也是残缺的文件。

最后只能采用最老土的解决方法:Response.Redirect(),转向实际文件地址。

FileInfo fi = new FileInfo(excelFile);
HttpResponse contextResponse = HttpContext.Current.Response;
contextResponse.Redirect(string.Format("~/Template/{0}", excelName), false);

这样在三个浏览器下测试都正常了,因为请求的是实际文件的地址,在迅雷中显示的也是实际文件的地址。下载就不会出现问题。但这样相当于告知客户端用户文件的实际地址,隐私性不佳。但好在这里并不需要太好的隐私性,而且文件会在一定时间之后删除,所以倒并不是太大的问题了。

上面是第一次考虑的结果,似乎还是有些懒了……

事后考虑,既然每次迅雷实际都是重新请求URL,那么我们就应该给迅雷传入一个能生成Excel文件的URL。

即,在点击“生成Excel”按钮的时候,转向另一个Export页面,在这个页面的Page_Load方法中完成生成Excel文件、下载Excel文件的步骤。

String fileName = Request.QueryString["FileName"];
String exportName = Request.QueryString["Export"];
if(fileName != null)
{ExportManger.CreateExcel(fileName);//先在服务器端创建Excel文件。Response.Redirect(String.Format("{0}?Export={1}",Request.Path.ToString(),fileName));//重定向到本页面,但Query参数变为Export。
}
else if(exportName != null)
{ExportManger.ExportExcel(exportName);//下载Excel文件。
}

这里页面跳转了两次,第一次是生成Excel,第二次是下载Excel。

之所以跳转两次,是因为迅雷会捕获最后的URL,如果生成和下载放在一起进行,那么迅雷下载时会重复再生成一遍Excel文件。下载Excel文件的代码ExportManger.ExportExcel(exportName)就使用了本文开头介绍的Response.Write方法,也可以用分段下载的方法:

if(fi.Length > 0)
{FileStream sr = new FileStream(fi.FullName,System.IO.FileMode.Open,System.IO.FileAccess.Read, System.IO.FileShare.Read);int size = 1024;//设置每次读取长度。for (int i = 0; i < fi.Length / size + 1; i++){byte[] buffer = new byte[size];int length = sr.Read(buffer, 0, size);contextResponse.OutputStream.Write(buffer, 0, length);}sr.Close();
}
else
{contextResponse.WriteFile(fi.FullName);
}

这里的结果是只生成了一次Excel并在服务器保留,以后每次下载的时候都使用带"Export"的参数下载相同的文件。那么如果需要文件只是一次性的,每次下载都需要重新生成,则只需要把Export页面的下载和生成放到一起。然后把开头的Response.Write方法最后变成:

contextResponse.Flush();
fi.Delete();
contextResponse.End();
即每次响应清空后把文件先删除,再结束响应。

这样就解决了利用下载工具出现的下载不能的问题,同时保护了服务器文件地址的隐私,并可以采用分段写入的方法写入大文件,而且可以按需要即时删除生成的文件而不占用服务器空间。

转载于:https://www.cnblogs.com/GIS_zhou/archive/2009/10/07/1578658.html

Asp.net生成Excel文件并下载(解决使用迅雷下载页面而不是文件的问题)相关推荐

  1. 【原】Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...

    这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法. 生成Excel文件的方法,见:[原].Net创建Excel文件(插入数据.修改格式.生成图表)的方法 先试用Response.W ...

  2. java迅雷下载excel,Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...

    (一) 如果在迅雷的下载对话框中点取消,则会使用IE的下载,这里的文件又是正确的了: 怀疑迅雷是根据下载对话框中的网址重新请求下载,与发起请求的页面已经无关,而IE又不会把ViewState信息传到迅 ...

  3. Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...

    这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法. 生成Excel文件的方法,见:[原].Net创建Excel文件(插入数据.修改格式.生成图表)的方法 先试用Response.W ...

  4. 解决使用迅雷下载页面而不是文件的问题

    先试用Response.WriteFile的方法: FileInfo fi = new FileInfo(excelFile);//excelFile为文件在服务器上的地址 HttpResponse ...

  5. 百度云下载转化为迅雷下载的解决办法

    解决办法:转化为迅雷下载. 教程:用迅雷下载百度网盘文件的方法(包括超过2G的大文件), 当然其他下载工具也行,得靠自己依葫芦画瓢: 如果你有迅雷会员,那更求之不得!!! 当然没有的也不怕,这个下载方 ...

  6. 迅雷可以下载的文件是forum.php,调用迅雷下载开放引擎下载文件

    迅雷下载开放引擎 迅雷下载开放引擎是迅雷开放下载技术的重要产品,依托迅雷强大的下载加速技术和将近4亿互联网用户覆盖,开放下载相关调用接口,为第三方客户端软件提供免费.高速.省带宽的下载加速服务. 官方 ...

  7. mysql遍历 xml文件路径_解决Mapper接口和mapper.xml的文件位置问题

    今天遇到一个问题是mybatis中接口和对应的mapper文件位置不同,而引起的操作也会不同,在网上找了好久最终找到了方法,这里就简单的解析一下: 我们知道在典型的maven工程中,目录结构有:src ...

  8. android下载文件地址,安卓迅雷下载的文件在哪里迅雷下载文件存放位置-独木成林...

    其实一般播放器都会有显示下载文件的默认路径的.按照路径提供的位置在手机文件管理器就很容易能找到,像手机迅雷的默认保存路径是在手机存储卡的 "ThunderDownload"文件夹下 ...

  9. PHP 生成下载地址例如迅雷下载

    <meta charset="utf-8"> <?php function Download($url) {$urlodd=explode('//',$url,2 ...

最新文章

  1. Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)
  2. AI又进阶!除了鉴别PS图片,还能一键卸妆
  3. MySQL 源码 需要 什么基础_MySQL 基础之 源码 部署
  4. 趣解面试高频算法难题:数组中的第K个最大元素
  5. [LintCode] Single Number 单独的数字
  6. 关于vue 框架与后台框架的混合使用的尝试
  7. MVC.Net: jqueryval错误
  8. 解决启动Distributed Transaction Coordinator服务出错的问题
  9. Python 语法糖
  10. jquery的ajax全局事件和AJAX 请求正在进行时显示“正在加载”
  11. JAVA入门到精通-第16讲-数组
  12. python 拼音相似度_用Python进行简单的文本相似度分析
  13. 最简单的Qt配置opencv教程
  14. linux 固态硬盘 分区工具,固态硬盘怎么分区?使用免费分区助手轻松搞定!
  15. STM32F103 硬件SPI+WM8978单声道语音回环
  16. 远程计算机打印,教你玩转远程终端打印机
  17. swift 判断当前设备网络是否可用
  18. angular : 自定义组件双向绑定 [(ngModel)]
  19. 技术人员如何做晋升答辩
  20. 一个学机械的中年人半年时间入门物联网嵌入式的历程

热门文章

  1. oracle查看控件文件 tns
  2. 浏览器时间久了重新登录_以登录为例讲解什么是全面的测试设计
  3. 网络营销外包浅析当前行业竞争压力之下网络营销外包公司如何应对?
  4. 网络营销专员浅析网络营销推广基本形式你更中意哪种?
  5. 网络营销外包——网络营销外包专员如何做好网站锚文本优化?
  6. 原创文章收录不高从根源找问题
  7. SEO站内优化细节不可少,教你4个小技巧!
  8. c语言行末不要输出多余空格,新人提问:如何将输出时每行最后一个空格删除...
  9. python 微信模块_Python使用itchat模块实现简单的微信控制电脑功能示例
  10. proteus如何添加stm32_【Proteus】单片机H桥驱动24V直流有刷电机