ASP.NET 文件断点续传实现代码
程序员文章站
2024-03-06 21:03:56
这里我通过response类中的addheader方法将一个http头添加到输出流中。在http头中,是由头信息和体信息组成。两者之间用一行空行分开。这里利用在头中加入ra...
这里我通过response类中的addheader方法将一个http头添加到输出流中。在http头中,是由头信息和体信息组成。两者之间用一行空行分开。这里利用在头中加入range段,来表示客户端希望从何处继续下载,来实现续传功能。
好了废话不多说,让我们开始吧。
1.新建1个主页,名字随便起哈。
2.在该页中添加1个linkbutton按钮,该按钮用来执行实现的过程。
3.在linkbutton的click事件中,实现断点续传功能。
代码如下:
另外不要忘记引用system.io命名空间,这里只贴出后台实现代码了(前台不会可以回去从学了。。。)
using system;
using system.data;
using system.configuration;
using system.collections;
using system.web;
using system.web.security;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.webcontrols.webparts;
using system.web.ui.htmlcontrols;
using system.io;
public partial class dfile : system.web.ui.page
{
protected void page_load(object sender, eventargs e)
{
}
protected void linbtndfile_click(object sender, eventargs e)
{
// 创建一比特数组
byte[] buffer = new byte[10240];
// 指定要下载文件的路径.
string filepath = @"d:\爱智旮旯.rar";
// 或取文件名包括扩展名
string filename = path.getfilename(filepath);
stream filestream = null;
try
{
// 打开文件
filestream = new filestream(filepath, filemode.open, fileaccess.read, fileshare.read);
response.clear();
// 获取文件的大小
long filesize = filestream.length;
long sum = 0;
if (request.headers["range"] != null)
{
response.statuscode = 206; // 表示返回到客户端的 http 输出状态的整数。默认值为 200。
sum = long.parse(request.headers["range"].replace("bytes=", "").replace("-", ""));
}
if (sum != 0)
{
response.addheader("content-range", "bytes " + sum.tostring() + "-" + ((long)(filesize)).tostring() + "/" + filesize.tostring());
}
// 获取部分http头信息
response.addheader("content-length", ((long)(filesize - sum)).tostring());
response.contenttype = "application/octet-stream";
//获取文件来源
response.addheader("content-disposition", "attachment; filename=" + httputility.urlencode(request.contentencoding.getbytes(filename)));
// response.flush();
filestream.position = sum; //设置当前流位置
filesize = filesize - sum;
// 当文件大小大于0是进入循环
while (filesize > 0)
{
// 判断客户端是否仍连接在服务器
if (response.isclientconnected)
{
// 获取缓冲区中的总字节数.
int length = filestream.read(buffer, 0, 10240);
// 写入数据
response.outputstream.write(buffer, 0, length);
// 将缓冲区的输出发送到客户端
response.flush();
buffer = new byte[10240];
filesize = filesize - length;
}
else
{
//当用户断开后退出循环
filesize = -1;
}
}
}
catch (exception ex)
{
response.write("error : " + ex.message);
}
finally
{
if (filestream != null)
{
//关闭文件
filestream.close();
}
response.end();
}
}
}
这里比较简单,请根据实际情况作适当修改。
好了废话不多说,让我们开始吧。
1.新建1个主页,名字随便起哈。
2.在该页中添加1个linkbutton按钮,该按钮用来执行实现的过程。
3.在linkbutton的click事件中,实现断点续传功能。
代码如下:
另外不要忘记引用system.io命名空间,这里只贴出后台实现代码了(前台不会可以回去从学了。。。)
复制代码 代码如下:
using system;
using system.data;
using system.configuration;
using system.collections;
using system.web;
using system.web.security;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.webcontrols.webparts;
using system.web.ui.htmlcontrols;
using system.io;
public partial class dfile : system.web.ui.page
{
protected void page_load(object sender, eventargs e)
{
}
protected void linbtndfile_click(object sender, eventargs e)
{
// 创建一比特数组
byte[] buffer = new byte[10240];
// 指定要下载文件的路径.
string filepath = @"d:\爱智旮旯.rar";
// 或取文件名包括扩展名
string filename = path.getfilename(filepath);
stream filestream = null;
try
{
// 打开文件
filestream = new filestream(filepath, filemode.open, fileaccess.read, fileshare.read);
response.clear();
// 获取文件的大小
long filesize = filestream.length;
long sum = 0;
if (request.headers["range"] != null)
{
response.statuscode = 206; // 表示返回到客户端的 http 输出状态的整数。默认值为 200。
sum = long.parse(request.headers["range"].replace("bytes=", "").replace("-", ""));
}
if (sum != 0)
{
response.addheader("content-range", "bytes " + sum.tostring() + "-" + ((long)(filesize)).tostring() + "/" + filesize.tostring());
}
// 获取部分http头信息
response.addheader("content-length", ((long)(filesize - sum)).tostring());
response.contenttype = "application/octet-stream";
//获取文件来源
response.addheader("content-disposition", "attachment; filename=" + httputility.urlencode(request.contentencoding.getbytes(filename)));
// response.flush();
filestream.position = sum; //设置当前流位置
filesize = filesize - sum;
// 当文件大小大于0是进入循环
while (filesize > 0)
{
// 判断客户端是否仍连接在服务器
if (response.isclientconnected)
{
// 获取缓冲区中的总字节数.
int length = filestream.read(buffer, 0, 10240);
// 写入数据
response.outputstream.write(buffer, 0, length);
// 将缓冲区的输出发送到客户端
response.flush();
buffer = new byte[10240];
filesize = filesize - length;
}
else
{
//当用户断开后退出循环
filesize = -1;
}
}
}
catch (exception ex)
{
response.write("error : " + ex.message);
}
finally
{
if (filestream != null)
{
//关闭文件
filestream.close();
}
response.end();
}
}
}
这里比较简单,请根据实际情况作适当修改。