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. DataInput接口说明及其实现类

    一. DataInput接口 DataInput接口提供了一系列的方法从二进制流中读取字节,并将读取出来的字节转换成任意的java基本类型,包括转换成UTF-8类型的字符串. 该接口中主要方法介绍如下 ...

  2. 【转】C#反编译工具

    源地址:https://blog.csdn.net/kongwei521/article/details/54927689 源地址:https://www.cnblogs.com/JamesLi201 ...

  3. python中将12345转换为'12345',不要使用str

    a = 12345 #创建一个空字符串 ret = "" #whlie循环,条件为当a为true时,即a不是 0的时候 while a : #定义一个变量,对a求余 last = ...

  4. LintCode之奇偶分割数组

    题目描述: 我的分析:题目要求将奇数放在偶数的前面,没有要求将奇数或偶数排序,因此我可以设置两个指针,一个(i)指向数组第一个数字,另一个(j)指向数组的最后一个数字,因为奇数要放在前面,所以从后往前 ...

  5. css > 的写法 html

    .userInfo-view .info .name::after { content: " "; display: inline-block; height: 12rpx; wi ...

  6. 如果遇到找不到元素如何处理? Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"investmentframe"}

    常见几种原因与应对,详细参见http://www.blogjava.net/qileilove/archive/2014/12/11/421309.html 1,动态ID无法找到,用xpath路径解决 ...

  7. centos7运行yum报如下提示:Run "yum repolist all" to see the repos you have

    centos7运行yum报如下提示: There are no enabled repos. Run "yum repolist all" to see the repos you ...

  8. 测开之路三十五:css引入

    CSS是一种定义样式结构,如字体.颜色.位置等的语言,被用于描述网页上的信息格式化和现实的方式.CSS样式可以直接存储于HTML网页或者单独的样式单文件.无论哪一种方式,样式单包含将样式应用到指定类型 ...

  9. std::sort的详细用法

    #include <algorithm> #include <functional> #include <array> #include <iostream& ...

  10. 如何保存android app日志

    android 手机日志保存方法如下: 前置条件:已安装adb 1,手机usb连接电脑,打开USB调试模式(注意仅连接一台手机设备) 2,win+R输入cmd打开命令窗口,输入指令:adb devic ...