gpt4 book ai didi

c# - 在下载文件之前从 http 请求中获取文件/AssetBundle 大小

转载 作者:行者123 更新时间:2023-12-04 14:23:07 25 4
gpt4 key购买 nike

题:

我想在完成下载文件之前获取 assetBundle 的大小。我可以向用户显示剩余时间。在Unity2018.2中,我们可以得到吗?文件大小 下载文件大小 让我乘以 进度 ?或者还有其他方法来计算剩余时间 ?

我知道 WWW.responseHeaders 包含信息,但似乎需要完成下载。

这是我目前的代码。

    using (WWW downloadPackageWWW = new WWW(pkg.url))
{
while (!downloadPackageWWW.isDone)
{
print("progress: " + downloadPackageWWW.progress * 100 + "%");
yield return null;
}

if (downloadPackageWWW.error != null)
print("WWW download had an error:" + downloadPackageWWW.error);
if (downloadPackageWWW.responseHeaders.Count > 0)
print(pkg.fileName + ": " + downloadPackageWWW.responseHeaders["Content-Length"]+" byte");

byte[] bytes = downloadPackageWWW.bytes;
File.WriteAllBytes(pkgPath, bytes);

}

——

更新:

为了得到剩余时间,我提出了一个理想的计算方法 Time.deltaTime ,而且我们不需要知道总文件大小和下载速度。
float lastProgress = 0;
while (!www.isDone)
{
float deltaProgress = www.progress - lastProgress;
float progressPerSec = deltaProgress / Time.deltaTime;
float remaingTime = (1 - www.progress) / progressPerSec;
print("Remaining: " + remaingTime + " sec");
lastProgress = www.progress;
yield return null;
}

最佳答案

您应该使用 Unity 的 UnityWebRequest API 来提出我们的请求。在您当前的 Unity 版本中,WWW API 现在是在 UnityWebRequest 之上实现的在引擎盖下,但它仍然缺乏许多功能。

您可以通过两种方式在不下载或等待文件下载完成的情况下获取文件的大小:

1 .制作 HEAD请求 UnityWebRequest.Head .然后您可以使用 UnityWebRequest.GetResponseHeader("Content-Length")获取数据的大小。

IEnumerator GetFileSize(string url, Action<long> resut)
{
UnityWebRequest uwr = UnityWebRequest.Head(url);
yield return uwr.SendWebRequest();
string size = uwr.GetResponseHeader("Content-Length");

if (uwr.isNetworkError || uwr.isHttpError)
{
Debug.Log("Error While Getting Length: " + uwr.error);
if (resut != null)
resut(-1);
}
else
{
if (resut != null)
resut(Convert.ToInt64(size));
}
}

用法 :
void Start()
{
string url = "http://ipv4.download.thinkbroadband.com/5MB.zip";
StartCoroutine(GetFileSize(url,
(size) =>
{
Debug.Log("File Size: " + size);
}));
}

2 .另一种选择是使用 UnityWebRequestDownloadHandlerScript然后覆盖 void ReceiveContentLength(int contentLength)功能。一旦您调用 SendWebRequest功能, ReceiveContentLength函数应该为您提供 contentLength 中的下载大小范围。然后你应该中止 UnityWebRequest要求。 Here是如何使用 DownloadHandlerScript 的一个示例.

我会选择第一个解决方案,因为它更简单、更容易并且需要更少的资源来工作。

关于c# - 在下载文件之前从 http 请求中获取文件/AssetBundle 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51664388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com