用unity2022写一个文件下载功能,支持断点续传,支持MD5比对,支持下载进度显示
时间: 2024-02-11 17:06:02 浏览: 168
好的,我可以为您提供一份简单的代码示例,用于在Unity 2022中实现文件下载功能,支持断点续传、MD5比对和下载进度显示。该示例使用Unity的WebRequest API来执行文件下载操作。
以下是代码示例:
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System.IO;
public class FileDownloader : MonoBehaviour
{
public string url; // 要下载的文件的URL
public string localFilePath; // 下载文件的本地路径
public bool useMD5Check = true; // 是否使用MD5校验
public bool useResume = true; // 是否支持断点续传
private bool isDownloading = false;
private UnityWebRequest request;
private FileStream fileStream;
private string md5 = "";
void Start()
{
// 获取文件名
string fileName = Path.GetFileName(localFilePath);
// 创建文件夹
string directoryName = Path.GetDirectoryName(localFilePath);
if (!Directory.Exists(directoryName))
{
Directory.CreateDirectory(directoryName);
}
// 打开文件流
if (useResume)
{
if (File.Exists(localFilePath))
{
fileStream = File.OpenWrite(localFilePath);
fileStream.Seek(0, SeekOrigin.End);
}
else
{
fileStream = File.Create(localFilePath);
}
}
else
{
fileStream = File.Create(localFilePath);
}
// 创建请求
request = UnityWebRequest.Get(url);
// 添加断点续传头部
if (useResume)
{
if (File.Exists(localFilePath))
{
request.SetRequestHeader("Range", "bytes=" + fileStream.Length + "-");
}
}
// 开始下载
isDownloading = true;
StartCoroutine(Download());
}
IEnumerator Download()
{
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
{
Debug.Log(request.error);
isDownloading = false;
yield break;
}
else
{
if (useResume && fileStream.Length > 0)
{
Debug.Log("Resume download successful!");
}
// 写入文件
byte[] data = request.downloadHandler.data;
fileStream.Write(data, 0, data.Length);
fileStream.Close();
// 计算MD5校验值
if (useMD5Check)
{
md5 = GetMD5(localFilePath);
}
Debug.Log("Download complete!");
isDownloading = false;
}
}
void Update()
{
// 显示下载进度
if (isDownloading)
{
float progress = request.downloadProgress;
Debug.Log("Download progress: " + progress);
}
}
void OnDestroy()
{
if (request != null)
{
request.Dispose();
}
if (fileStream != null)
{
fileStream.Close();
fileStream.Dispose();
}
}
// 计算文件的MD5校验值
private string GetMD5(string filePath)
{
string md5 = "";
using (FileStream fs = File.OpenRead(filePath))
{
md5 = System.Security.Cryptography.MD5.Create().ComputeHash(fs).ToString();
}
return md5;
}
}
```
该示例中,使用UnityWebRequest API创建一个HTTP GET请求,然后使用downloadHandler属性读取服务器返回的数据,再将数据写入文件流中。如果使用MD5校验,可以调用GetMD5()方法计算文件的MD5校验值。
此外,示例还支持断点续传功能,通过设置HTTP头部的“Range”字段来实现。如果文件已经存在,则在文件末尾接着下载;否则,创建一个新的文件并下载。
最后,示例还支持下载进度显示,通过检查downloadProgress属性来实现。
阅读全文