Update download system

完善断点续传下载
pull/40/head
hevinci 2022-09-05 15:06:13 +08:00
parent 8d2779b446
commit ec25af8517
3 changed files with 116 additions and 4 deletions

View File

@ -0,0 +1,87 @@
using System;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
namespace YooAsset
{
/// <summary>
/// 支持Unity2018版本的断点续传下载器
/// </summary>
public class DownloadHandlerFileRange : DownloadHandlerScript
{
private string _fileSavePath;
private long _fileTotalSize;
private UnityWebRequest _webRequest;
private FileStream _fileStream;
private long _localFileSize = 0;
private long _curFileSize = 0;
public DownloadHandlerFileRange(string fileSavePath, long fileTotalSize, UnityWebRequest webRequest) : base(new byte[1024 * 1024])
{
_fileSavePath = fileSavePath;
_fileTotalSize = fileTotalSize;
_webRequest = webRequest;
if (File.Exists(fileSavePath))
{
FileInfo fileInfo = new FileInfo(fileSavePath);
_localFileSize = fileInfo.Length;
}
_fileStream = new FileStream(_fileSavePath, FileMode.Append, FileAccess.Write);
_curFileSize = _localFileSize;
}
protected override bool ReceiveData(byte[] data, int dataLength)
{
if (data == null || dataLength == 0 || _webRequest.responseCode >= 400)
return false;
if (_fileStream == null)
return false;
_fileStream.Write(data, 0, dataLength);
_curFileSize += dataLength;
return true;
}
/// <summary>
/// UnityWebRequest.downloadHandler.data
/// </summary>
protected override byte[] GetData()
{
return null;
}
/// <summary>
/// UnityWebRequest.downloadHandler.text
/// </summary>
protected override string GetText()
{
return null;
}
/// <summary>
/// UnityWebRequest.downloadProgress
/// </summary>
protected override float GetProgress()
{
return _fileTotalSize == 0 ? 0 : ((float)_curFileSize) / _fileTotalSize;
}
/// <summary>
/// 释放下载句柄
/// </summary>
public void Cleanup()
{
if (_fileStream != null)
{
_fileStream.Flush();
_fileStream.Dispose();
_fileStream = null;
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 94254ab8e4496214884c11a891c131c6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -9,8 +9,9 @@ namespace YooAsset
{ {
internal sealed class FileDownloader : DownloaderBase internal sealed class FileDownloader : DownloaderBase
{ {
private UnityWebRequest _webRequest; private readonly bool _breakResume;
private bool _breakResume; private UnityWebRequest _webRequest = null;
private DownloadHandlerFileRange _downloadHandle = null;
// 重置变量 // 重置变量
private bool _isAbort = false; private bool _isAbort = false;
@ -75,8 +76,15 @@ namespace YooAsset
_requestURL = GetRequestURL(); _requestURL = GetRequestURL();
_webRequest = UnityWebRequest.Get(_requestURL); _webRequest = UnityWebRequest.Get(_requestURL);
DownloadHandlerFile handler = new DownloadHandlerFile(fileSavePath, true);
#if UNITY_2019_4_OR_NEWER
var handler = new DownloadHandlerFile(fileSavePath, true);
handler.removeFileOnAbort = false; handler.removeFileOnAbort = false;
#else
var handler = new DownloadHandlerFileRange(fileSavePath, _bundleInfo.Bundle.FileSize, _webRequest);
_downloadHandle = handler;
#endif
_webRequest.downloadHandler = handler; _webRequest.downloadHandler = handler;
_webRequest.disposeDownloadHandlerOnDispose = true; _webRequest.disposeDownloadHandlerOnDispose = true;
if (fileLength > 0) if (fileLength > 0)
@ -218,6 +226,12 @@ namespace YooAsset
} }
private void DisposeWebRequest() private void DisposeWebRequest()
{ {
if(_downloadHandle != null)
{
_downloadHandle.Cleanup();
_downloadHandle = null;
}
if (_webRequest != null) if (_webRequest != null)
{ {
_webRequest.Dispose(); _webRequest.Dispose();