ASP.NET 大文件下载的实现思路及代码
当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃。可以参考如下代码来避免这个问题。
using System;
namespace WebApplication1
{
public partial class DownloadFile : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
System.IO.Stream iStream = null;
// Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10000];
// Length of the file:
int length;
// Total bytes to read.
long dataToRead;
// Identify the file to download including its path.
string filepath = Server.MapPath("/") +"./Files/TextFile1.txt";
// Identify the file name.
string filename = System.IO.Path.GetFileName(filepath);
try
{
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.Read);
// Total bytes to read.
dataToRead = iStream.Length;
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "text/plain"; // Set the file type
Response.AddHeader("Content-Length", dataToRead.ToString());
Response.AddHeader("Content-Disposition", "p_w_upload; filename=" + filename);
// Read the bytes.
while (dataToRead > 0)
{
// Verify that the client is connected.
if (Response.IsClientConnected)
{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10000);
// Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length);
// Flush the data to the HTML output.
Response.Flush();
buffer = new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
// Prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
{
// Trap the error, if any.
Response.Write("Error : " + ex.Message);
}
finally
{
if (iStream != null)
{
//Close the file.
iStream.Close();
}
Response.End();
}
}
}
}
关于此代码的几点说明:
1. 将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据。
2. 根据下载的文件类型来指定 Response.ContentType 。(参考OSChina的这个网址可以找到大部分文件类型的对照表:http://tool.oschina.net/commons)
3. 在每次写完response时记得调用 Response.Flush()
4. 在循环下载的过程中使用 Response.IsClientConnected 这个判断可以帮助程序尽早发现连接是否正常。若不正常,可以及早的放弃下载,以释放所占用的服务器资源。
5. 在下载结束后,需要调用 Response.End() 来保证当前线程可以在最后被终止掉。
原文链接:http://www.codeceo.com/article/asp-net-big-file.html
转载于:https://blog.51cto.com/6685336/1720023
ASP.NET 大文件下载的实现思路及代码相关推荐
- 大整数加法基本思路和代码(C++实现)
大整数加法基本思路和代码(C++实现) 前言 分析 编程 前言 如果给出两个很大很大的整数,这两个数大到long类型也装不下,比如100位整数,如何求它们的和呢? Java中有无敌的BigIntege ...
- Asp.net大文件下载
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, Eve ...
- php百度网盘登录,php登陆状态百度网盘获取文件下载链接【思路|部分代码】
本帖最后由 芊雨千寻 于 2017-7-2 10:55 编辑 不提供分享后的解析思路,其实很简单的但是访问多了老出验证码很尴尬.....php登陆百度云很麻烦的,但是通过浏览器复制下来百度的登陆状态c ...
- php 中 相关文章 的思路,php之购物车类思路及代码
相信大家肯定都在电商网站买过东西,当我们看中一件喜欢又想买的东西时,这时候你又不想这么快结账,这时候你就可以放入购物车: 就像我们平时去超市买东西一样,会推着购物车去买东西: 那么我们接下来看看jav ...
- 在ASP.NET中跟踪和恢复大文件下载
在Web应用程序中处理大文件下载的问题一直出了名的困难,因此对于大多数站点来说,如果用户的下载被中断了,它们只能说悲哀降临到用户的身上了.但是我们现在不必这样了,因为你可以使自己的ASP.NET应用程 ...
- 【多线程编程学习】java多线程基于数据分割的大文件下载器
文章目录 代码:基于数据分割的大文件下载器 作为包装的存储对象类: 主文件下载类: 子任务下载类: 处理缓存: 启动类: 数据分割思想产生的问题 代码来自书籍<java多线程编程实战指南> ...
- c#.Net MVC服务端下载文件、限制下载速度、大文件下载、对性能的影响、对大文件的支持、对断点续传和多线程下载的支持
一.ASP.NET文件下载各种方式比较:对性能的影响.对大文件的支持.对断点续传和多线程下载的支持 asp.net里提供了多种方式,从服务器端向客户端写文件流,实现客户端下载文件.这种技术在做防下载系 ...
- java 下载加速_Java实现大文件下载,提速30倍!想学?我教你啊!
前言 兄弟们看到这个标题可能会觉得是个标题党,为了解决疑虑,我们先来看下最终的测试结果: 测试云盘下载的文件 46M,自己本地最大下载速度 2M 1. 单线程下载,总耗时: 603s img 2. 多 ...
- ASP.NET系统分析与设计思路探讨 (原创)
ASP.NET系统分析与设计思路探讨 (以前做的一片文章,是学完3层结构后写在) ASP.NET是以浏览器为用户界面的,与WINDOWS方式最大的区别在于无法保持状态.假如用户必须完 ...
最新文章
- java的队列_java实现队列
- jupyter跑Java,C++/C,R
- c java python html_如何通俗地解释 C、C++、C#、Java、JavaScript、HTML、Python的用处
- WPF combox二级联动
- 外部定义了一个数组,在函数内用指针对其操作
- 今日代码(200714)--主客观求指标权重及求城市得分
- 工厂设计模式–一种有效的方法
- Vue.directive自定义指令
- 如何使用阿里云ARMS轻松重现用户浏览器问题
- 临颖一高2021高考成绩查询,临颍一高举办2021年决战高考百日冲刺誓师大会
- netty9---使用编码解码器
- mysql 临时表 中文_MySQL 临时表
- Spring boot 2.0 with Oauth2 + Jwt
- vue之elementui表单验证最基本实例
- 调用登录接口返回“参数错误”
- android谷歌地图_Android Google地图:添加天气数据
- 关于巨杉数据库的学习
- 同步MySQL跨库且不同shema表数据
- 莫名其妙出现各种syntax error的解决方案
- Android 适配Dark Theme(暗黑模式),看完跪了