Unity 断点下载:使用 UnityWebRequest 实现文件续传
使用 UnityWebRequest 实现断点下载可以通过设置 'range' 头部字段来实现。下面是一个简单的例子:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.IO;
public class DownloadManager : MonoBehaviour {
private string url = 'http://example.com/myfile.mp4';
private string savePath = Application.persistentDataPath + "/myfile.mp4";
private long fileSize;
private int bufferSize = 1024;
private int totalDownloaded = 0;
void Start () {
StartCoroutine(DownloadFile());
}
IEnumerator DownloadFile() {
UnityWebRequest request = UnityWebRequest.Head(url);
yield return request.SendWebRequest();
fileSize = long.Parse(request.GetResponseHeader('Content-Length'));
if (File.Exists(savePath)) {
totalDownloaded = (int)new FileInfo(savePath).Length;
request = UnityWebRequest.Get(url);
request.SetRequestHeader('Range', 'bytes=' + totalDownloaded + '-');
} else {
request = UnityWebRequest.Get(url);
}
request.downloadHandler = new DownloadHandlerBuffer();
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError) {
Debug.Log(request.error);
} else {
byte[] buffer = new byte[bufferSize];
int bytesRead;
using (FileStream file = new FileStream(savePath, FileMode.Append, FileAccess.Write)) {
file.Seek(totalDownloaded, SeekOrigin.Begin);
using (Stream stream = request.downloadHandler.data) {
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) {
file.Write(buffer, 0, bytesRead);
totalDownloaded += bytesRead;
}
}
}
Debug.Log('Download complete. Total downloaded: ' + totalDownloaded);
}
}
}
这个例子首先使用 Head 请求获取文件的大小,然后判断本地是否已经存在该文件,如果存在,则设置 'Range' 头部字段,请求文件的剩余部分;如果不存在,则直接请求整个文件。
在下载过程中,使用 FileStream 逐步将下载的数据写入本地文件,并记录已经下载的字节数。如果下载过程中发生错误,可以通过记录已经下载的字节数,重启应用程序后继续下载。
原文地址: https://www.cveoy.top/t/topic/lMO8 著作权归作者所有。请勿转载和采集!