unity文件下载HttpWebRequest

发布时间 2023-08-17 10:40:51作者: Trigger_F

/// <summary>
/// 下载进度
/// </summary>
public float Progress
{
get;
private set;
}
/// <summary>
/// 下载状态
/// </summary>
public int Status
{
get;
private set;
}
/// <summary>
/// 错误信息
/// </summary>
public string Error
{
get;
set;
}
/// <summary>
/// 总长度
/// </summary>
public long TotalLength
{
get;
private set;
}
/// <summary>
/// 保存路径
/// </summary>
private string savePath;
/// <summary>
/// url地址
/// </summary>
private string url;
/// <summary>
/// 超出时间
/// </summary>
private int timeOut;
/// <summary>
/// 子线程
/// </summary>
private Thread thread;
/// <summary>
/// 子线程是否停止
/// </summary>
private bool isStop;

/// <summary>
/// 构造函数 Http下载
/// </summary>
/// <param name="url">url地址</param>
/// <param name="timeout">超时时间</param>
/// <param name="callback">回调函数</param>
public DownLoadExcel(string url, string savePath, int timeout)
{
this.savePath = savePath;
this.url = url;
this.timeOut = timeout;
}
/// <summary>
/// 开启下载
/// </summary>
public void DownLoad()
{
// 开启线程下载
thread = new Thread(StartDownLoad);
thread.IsBackground = true;
thread.Start();
Debug.Log("开始下载");
}
/// <summary>
/// 开始下载
/// </summary>
private void StartDownLoad()
{
try
{
// 构建文件流
FileStream fs = new FileStream(this.savePath, FileMode.OpenOrCreate, FileAccess.Write);
// 文件当前长度
long fileLength = fs.Length;
// 文件总长度
TotalLength = GetDownLoadFileSize();
Debug.LogFormat("fileLen:{0}", TotalLength);
if (fileLength < TotalLength)
{
// 没有下载完成
fs.Seek(fileLength, SeekOrigin.Begin);
// 发送请求开始下载
HttpWebRequest request = WebRequest.Create(this.url) as HttpWebRequest;
request.AddRange((int)fileLength);
request.Timeout = this.timeOut;
// 读取文件内容
Stream stream = request.GetResponse().GetResponseStream();
if (stream.CanTimeout)
{
stream.ReadTimeout = this.timeOut;
}
byte[] buff = new byte[4096];
int len = -1;
while ((len = stream.Read(buff, 0, buff.Length)) > 0)
{
if (isStop)
{
break;
}
fs.Write(buff, 0, len);
fileLength += len;
Progress = fileLength * 1.0f / TotalLength;
}
stream.Close();
stream.Dispose();
}
else
{
Progress = 1;
}
fs.Close();
fs.Dispose();
// 标记下载完成
if (Progress == 1)
{
Status = 1;
}
}
catch (Exception e)
{
Error = e.Message;
Status = -1;
}
}
/// <summary>
/// 获取下载的文件大小
/// </summary>
/// <returns>文件大小</returns>
public long GetDownLoadFileSize()
{
HttpWebRequest request = WebRequest.Create(this.url) as HttpWebRequest;
request.Method = "HEAD";
request.Timeout = this.timeOut;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
return response.ContentLength;
}
/// <summary>
/// 关闭下载
/// </summary>
public void Close()
{
this.isStop = true;
}