本文将运用UnityWebRequest来进行文件的断点下载。

断点下载顾名思义,就是在程序退出或者暂定下载把已经下载好的数据存储起来,在下一次下载时接着上一次开始下载,不需要重新下载,既节省时间又节省流量。

本文关键语句:

            //创建网络请求
            UnityWebRequest unityWeb = UnityWebRequest.Get(downPath);
            //设置开始下载文件从什么位置开始
            unityWeb.SetRequestHeader("Range", "bytes=" + length + "-");//这句很重要

目前我的需求是下载的文件大小,下载时的进度,因为UnityWebRequest没有返回下载文件的大小,下载文件的进度(有返回进度但是返回的是0-1之间的小数 我们这想要的是从上次已下好的文件与现在开始的进度 比如:我上次下载了50% 我这次就应该从50%开始 ,UnityWebRequest给的进度还是从0%开始到100%所以我们继承unity给的 DownloadHandler 类来存储下载信息)

下面是DownloadFileHandler类的基本属性与字段。

        /// <summary>
        /// 文件总长度
        /// </summary>
        private int sumLength;
        public int SumLength
            get { return sumLength; }
        /// <summary>
        /// 已下载长度
        /// </summary>
        private int nowLength;
        /// <summary>
        /// 下载进度
        /// </summary>
        public float DownloadProgress
                if (sumLength== 0)
                    return 0f;
                    return (float)nowLength/ sumLength;

接下来是需要重写DownloadHandler中的方法

ReceiveContentLength(int contentLength) 返回的参数为下载文件的总长度 (以字节未单位)

【contentLength这个参数注意了 返回文件未下载的长度 故: 需要加上本地保存的文件长度才是整个下载文件的长度。】

 protected override void ReceiveContentLength(int contentLength)
            //这里真坑  断点下载 下次获取的是未下载的长度 需要加上本地已经下载的长度 才是整个文件 的总长度
            sumLength = contentLength + nowLength;

ReceiveData(byte[] data, int dataLength)  下载中每次都调用 data参数为当前下载的数据它还包含前面下载的数据  dataLength参数为当前下载的数据长度。 每次我们要的数据就是data的索引从0开始到索引dataLength-1之间的数据

protected override bool ReceiveData(byte[] data, int dataLength)
    //在这里我们就可以实现把下载的数据保存在本地文件            
    nowLength += dataLength;
    WriteFile(pathName, data, dataLength);
    return true;

还有一个重要的方法 CompleteContent() 下载完成时调用,在这个方法中可以把下载完成保存的临时文件修改成下载时的文件名。

扩展一个需求,在不下载的情况下获取到下载文件的大小这个在源码中会有。

源码地址UnityWebRequest断点下载源码 提取码:bsck

谢谢各位阅读我的文章,希望能给你们带来帮助,有不足之处请提出,大家共同进步。

本文将运用UnityWebRequest来进行文件的断点下载。 断点下载顾名思义,就是在程序退出或者暂定下载把已经下载好的数据存储起来,在下一次下载时接着上一次开始下载,不需要重新下载,既节省时间又节省流量。本文关键语句: //创建网络请求 UnityWebRequest unityWeb = UnityWebRequest....
最近有个项目需要在服务器下载视频资源到本地,然后在本地播放视频,一开始看Unity官方文档找到资源下载的方法,但是在下载超大资源(一个2.8G的.mp4格式的视频)的时候回出现未知错误导致视频不能下载下来,先看官方提供的方法如下。 using System.Collections; using System.IO; using UnityEngine; using UnityEngine.Networking; public class FileDownloader : MonoBehaviour {
以下是我们项目中实际应用的断点续传代码 public IEnumerator downloadByHttpRequest(string url,int id,string assetbundlename,GameObject slider,GameObject NoDown,GameObject BlueTop)         //临时文件名(把下载的资源的名字修改为临时名字 ) UnityWebRequest对象用于与web服务器通信。 unitywebre任务处理与web服务器的HTTP通信流。其他对象——特别是下载处理程序和UploadHandler——分别管理下载和上传数据。 为方便起见,提供了一组静态函数;这些返回UnityWebRequest对象为许多常见用例正确配置。看: Get, Post, Put, GetTexture. 注意:当UnityWebRequest通过调用Send方法
在使用HttpClient的过程中,可能请求的数据为空或者参数不对,服务器返回的内容导致Content-Length=0 此时,如果程序中直接拿到结果以正常处理,一般在转换为Json字符串处理,代码容易出错 如果在此加入如下,拿到Content-Length的长度,为0则不处理,有长度则继续执行 HttpResponse httpResponse = httpClient.execute(request); Header header = httpResponse.getFirstHeader(.
断点续传原理 记录已经下载到的本地文件大小,向资源服务器发送请求,拿到剩下还有多少没有下载(有请求头可以实现),然后接着没有下载到的地方开始再继续下载。 PS:只要确保是对同一个资源文件下载操作,那么就不存在资源会下载错误的情况,当然如果你在断点续传的阶段发现资源服务器上的资源已经更新,那就得删除之前下载文件然后重新下载UnityWebRequest下载文件 下载文件都是通过一个URL从资...
string url = "http://www.mzwu.com/test.apk"; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = "HEAD"; HttpW...
unity-多线程异步下载HttpWebRequest 的基础上, 增加断点下载功能 (代码有稍作修改, 适配断点下载), 应用场景是下载一个大文件时, 将文件分割成多个片段进行下载, 即使中间断网后, 重新下载时重已累积的下载大小的基础上, 继续剩余未下载完内容.效果如下, 最终下载完大小是 31,715KB (中间鼠标框选时, 进程已经杀了, 中断了下载, 后面重启进程继续累计下载)断点下载 MultiResumeMgr.cs 多线程下载 MultiDownMgr.cs 透传参数对象的封装
HttpWebRequest request = WebRequest.Create(tNowDownloadInfo.nNowDownloadURL) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; request.ServicePoint.ConnectionLimit = int.MaxValue; //使用流   一个非常实用的小功能,平常项目中可能会有这个需求:**Unity下载文件,并将下载进度显示出来。**今天总结一下!我们在下载的时候考虑的东西有很多,比如用户下载到了一半断开的情况,网络异常的情况等等。 代码如下:   这里下载服务器端的视频为例,测试在下载完成后, request.downloadProgress返回的值大约在0.97左右,小于1,所以在下载完成后,我们用代码控制将进度条的value值等于1。 //进度条 private Slider my_Slider;
由于WWW.progress在安卓上进度一直显示是0,所以只得自己动手写下载函数了。结合网上同行的代码,加上自己优化,总算完成了。 public class ItemScript : MonoBehaviour { string prompt = "ss"; void OnApplicationQuit() StopAllCoroutines();//关闭所有协程