public void DownFile(string guid)
{
var fileTransfer = new FileTransfer();
var directoryPath = Path.Combine(InitInfo.Config_GarbagePath, "FileImport", guid);
fileTransfer.ChunkTransfer(System.Web.HttpContext.Current, GetDownFilePath(directoryPath));
HttpContext.Response.Flush(); //删除临时文件
// Utility.DeleteDirectory(directoryPath);
}

 public bool ChunkTransfer(HttpContext httpContext, string filePathName)
{
bool result = false; if (!System.IO.File.Exists(filePathName))
{
httpContext.Response.StatusCode = 404;
return false;
}
long startPostion = 0;
long endPostion = 0;
string fileName = Path.GetFileName(filePathName);
using (FileStream fileStream = new FileStream(filePathName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (BinaryReader br = new BinaryReader(fileStream))
{
long fileLength = fileStream.Length;
string lastUpdateTime = System.IO.File.GetLastWriteTimeUtc(filePathName).ToString("r");
string eTag = HttpUtility.UrlEncode(fileName, Encoding.UTF8) + lastUpdateTime;//恢复下载时提取请求头;
if (httpContext.Request.Headers["If-Range"] != null)
{
if (httpContext.Request.Headers["If-Range"].Replace("\"", "") != eTag)
{//文件修改过
httpContext.Response.StatusCode = 412;//预处理失败
return false;
}
} httpContext.Response.Clear();
httpContext.Response.Buffer = false;
httpContext.Response.AddHeader("Accept-Ranges", "bytes");
httpContext.Response.AppendHeader("ETag", "\"" + eTag + "\"");
httpContext.Response.AppendHeader("Last-Modified", lastUpdateTime);//把最后修改日期写入响应
httpContext.Response.ContentType = "application/octet-stream";
if (httpContext.Request.UserAgent.IndexOf("MSIE") > -1 || (httpContext.Request.UserAgent.IndexOf("like Gecko") > -1))
{
fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", "%20");
} if (httpContext.Request.UserAgent.ToLower().IndexOf("firefox") > -1)
{
httpContext.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
}
else
{
httpContext.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
}
httpContext.Response.AddHeader("Connection", "Keep-Alive");
httpContext.Response.ContentEncoding = Encoding.UTF8;
if (httpContext.Request.Headers["Range"] != null)//续传
{
httpContext.Response.StatusCode = 206;//续传标识
string[] range = httpContext.Request.Headers["Range"].Split(new char[] { '=', '-' });
startPostion = long.Parse(range[1]);//已经下载的字节数
if (startPostion < 0 || startPostion >= fileLength)
{
return false;
}
if (string.IsNullOrEmpty(range[2]))//只指定请求文件起始
{
httpContext.Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startPostion, fileLength - 1, fileLength));
httpContext.Response.AddHeader("Content-Length", (fileLength - startPostion).ToString());
}
else//指定请求文件范围
{
endPostion = long.Parse(range[2]);
httpContext.Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startPostion, endPostion - startPostion - 1, fileLength));
httpContext.Response.AddHeader("Content-Length", (endPostion - startPostion).ToString());
}
}
else
{//非续传
httpContext.Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startPostion, fileLength - 1, fileLength));
httpContext.Response.AddHeader("Content-Length", (fileLength - startPostion).ToString());
} br.BaseStream.Seek(startPostion, SeekOrigin.Begin);
long maxCount = (long)Math.Ceiling((fileLength - startPostion + 0.0) / TransferBuffer);//分块下载,剩余部分可分成的块数
for (long i = 0; i < maxCount && httpContext.Response.IsClientConnected; i++)
{
httpContext.Response.BinaryWrite(br.ReadBytes(TransferBuffer));
httpContext.Response.Flush();
if (TransferSleep > 0)
{
Thread.Sleep(TransferSleep);
}
} result = true; }
} return result;
}

.net从服务端下载文件(可以断点续传)的更多相关文章

  1. 通过Java WebService接口从服务端下载文件

    一. 前言 本文讲述如何通过webservice接口,从服务端下载文件.报告到客户端.适用于跨系统间的文件交互,传输文件不大的情况(控制在几百M以内).对于这种情况搭建一个FTP环境,增加了系统部署的 ...

  2. java实现从服务端下载文件

    这边用一个简单的servlet实现java从服务端下载文件的操作 写一个servlet: <servlet> <servlet-name>DownloadServlet< ...

  3. 从服务端下载文件到本地windows

    之前常使用本地ubuntu和远程的centos服务器或者是本地mac和远程centos服务器通过命令scp或者nc来进行文件的传输. 现在用的是windows系统,欲将服务器的某文件load到本地. ...

  4. FTP 服务器在WIN10上的搭建及服务端下载文件实例

    1.搭建 (1)控制面板--->程序----->将FTP服务器打勾 (2)输入iis,或者右键桌面-->管理-->服务和应用程序--->internet informat ...

  5. oracle 11g 服务端下载地址及安装说明

        oracle 11g 服务端下载地址及安装说明         分类:             Oracle              2013-11-17 19:40     988人阅读  ...

  6. ftpget 从Windows FTP服务端获取文件

    /********************************************************************************* * ftpget 从Windows ...

  7. 【2017-05-30】WebForm文件上传。从服务端删除文件

    用 FileUpload控件进行上传文件. <asp:FileUpload ID="FileUpload1"  runat="server" /> ...

  8. WEB服务端安全---文件上传漏洞

    1.简述 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力.这种攻击方式是最直接和有效的,而且互联网中我们经常会用到文件上传功能,它本身是没有问题的,正常的业 ...

  9. python-局域网内实现web页面用户端下载文件,easy!

    好久没有发博客了,但是也没闲着,最近疫情原因一直在家远程办公,分享一下今天的干货 先说需求:某个文件压缩之后可以供用户点击下载 没想到特别好的办法,在网上搜索大多都是通过socket实现的,然后我这个 ...

随机推荐

  1. netty-Selector

    上图中加入一句: socketChannel.configureBlocking(false);//设置为非阻塞的 keyIterator.clear(); 每连接一个SocketChannel 都会 ...

  2. 4412 linux延时和时间

    基本知识 • linux中延时函数很简单,却经常用到• 在操作系统中和单片机处理延时方式就完全不一样了,不可能是使用for循环浪费系统资源.而是有专门的接口函数• linux系统编程中常用的延时函数: ...

  3. Delphi读取和写入utf-8编码格式的文件

    读取UTF-8格式的文件内容 function LoadUTF8File(AFileName: string): string; var ffileStream:TFileStream; fAnsiB ...

  4. BUUCTF | [SUCTF 2019]CheckIn

    感觉这题师傅们已经写得很详细了,我就做一个思路梳理吧,顺道学一波.user.ini 步骤: 1.上传一个“.user.ini”文件 2.上传自己的马“a.jpg” 3.菜刀连接 "http: ...

  5. jQuery-resize和scroll的性能优化

    ## 下面是进行测试和研究怎么实现的用的 Document 改变页面大小试试 Document 滚动滚动条试试

  6. 聚合函数:sum,count,max,avg

    聚合函数:sum,count,max,avg等,一般作用于多条记录上.通过group by可以将数据对属于一组的数据起作用. SELECT region, SUM(population), SUM(a ...

  7. linux-centOS环境下安装jdk8

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lx_Frolf/article/det ...

  8. 转 zookeeper,dubbo和Nginx的区别

    Nginx是著名的反向代理服务器,也被广泛的作为负载均衡服务器 ZooKeeper是分布式协调服务框架,有时也被用来做负载均衡 那么他们的区别是什么?如何选择呢? 下面从实际场景看下他们的关系 Ngi ...

  9. JVM系列(二) — Java垃圾收集介绍

    这篇文章主要从以下几个方面介绍垃圾收集的相关知识 一.判断对象是否已死 二.主流垃圾收集算法 三.内存分配与回收策略 本章节主要从以下几个思考点着手介绍垃圾回收的相关知识:哪些内存需要回收?什么时候回 ...

  10. 关于Java序列化你应该知道的一切

    什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术. Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数 ...