C# 文件下载之断点续传

前端之家收集整理的这篇文章主要介绍了C# 文件下载之断点续传前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

代码,更多细节请参考本文附带的 demo。

文件中的一部分数据。这样我们就可以把已经下载的数据存起来,下次只用请求剩余的数据即可,当全部数据都下载到本地后再完成合并工作。

文件的第 500 到第 999 这 500 个字节。

文件需要下载,第一次请求时不用指定 Range 头,表示下载整个文件。但在下载完第 499 个字节后,下载被取消了。那么在下一次请求下载同一个文件时,只需要下载第 500 个字节至第 999 个字节的数据就可以了。原理看上去很简单,但我们需要考虑下面几个问题:

支持 Range 头?文件发生了变化怎么办?文件拼成原始大小后,如何验证它和源文件一模一样?

支持

方法是,当服务器不支持请求部分数据时,都会返回 Accept-Ranges: none,我们只要判断这个返回值是不是等于 none 就行了。代码如下:

(res.Headers[] != s = res.Headers[ (s ==

文件是否变化

文件的一部分之后,可能马上就会接着下载,也可能会过一段时间再下载,也可能永远不会再接着下载了…文件还是当初下载了一半的那个文件。如果服务器上的文件已经更新了,那无论如何都需要重新从头开始下载。只有在服务器上的文件没有发生变化的情况下,断点续传才有意义。

内容的字符串,当请求的资源发生变化后,对应的 ETag 也会变化。好了,最简单的办法是第一次请求时,把响应头中的 ETag 存下来,下次请求时做比较。代码如下:

newEtag =文件内容 内容的临时文件 (File.Exists(tempFileName) && oldEtag = (!.IsNullOrEmpty(oldEtag) && !.IsNullOrEmpty(newEtag) && newEtag == resumeDowload = (! (res.Headers[] != res.Headers[

修改时间。使用方法和 ETag 大体相同。

文件操作。大体思路是如果有未下载完的文件,就把新下载的字节添加文件的末尾,不再啰嗦,有兴趣的同学请直接看 demo 代码

文件

文件,如果整个过程中稍有没有处理好的异常,可能最后得到的文件就和源文件不太一样。因此最好是能够对下载好的文件进行一次校验。可这也是最难、最不容易实现的。因为它需要服务器端的支持,比如服务器端在提供一个可下载文件的同时提供该文件的 MD5 hash。当然,如果服务器端也是我们自己创建的,我们就可以去实现它。但我们又怎么能够要求现存的 web 服务器都提供这样的功能呢!

猜你在找的C#相关文章