c# - 是否可以从在 Unity3D 中没有真实文件路径的 API 链接获取/下载文件?
问题描述
我尝试从 api 获取一些可下载的文件而不返回真实的文件路径,例如www.domain.com/api/get-audio?name=foo.mp3,当在浏览器中打开文件时会自动下载,但似乎在 Unity必须有一些功能才能下载文件,例如:
IEnumerator GetTheFoo(string path)
{
using (UnityWebRequest www = UnityWebRequest.Get(path))
{
www.SendWebRequest();
while (www.downloadProgress < 0.01)
{
Debug.Log(www.downloadProgress);
yield return new WaitForSeconds(.1f);
}
if (www.isNetworkError)
{
Debug.Log("error");
}
else
{
Debug.Log(Application.persistentDataPath);
string savePath = string.Format("{0}/{1}.mp3", Application.persistentDataPath, "foo");
System.IO.File.WriteAllText(savePath, www.downloadHandler.text);
}
}
}
我得到了文件,但是在我检查文件后返回错误的大小并且可能不是声音文件,因为我无法播放它,我在谷歌上深入搜索下载文件的最佳方式,我看到所有示例和给出的解决方案都带有链接真实路径文件,如文件/音频/foo.mp4,因此是否可以从 API 或不包含真实路径的链接获取可下载文件?
[更新]
100% 是我自己的错,抱歉我缺乏知识
yield return www.SendWebRequest();
解决方案
你做
while (www.downloadProgress < 0.01)
{
Debug.Log(www.downloadProgress);
yield return new WaitForSeconds(.1f);
}
因此,您要等到1%
下载完成后再尝试保存文件。您应该等到所有内容都下载完毕,例如
while (www.downloadProgress < 1f)
{
Debug.Log(www.downloadProgress);
yield return new WaitForSeconds(.1f);
}
或者如果您不需要进度更新,您也可以直接使用
yield return www.SendWebRequest();
那么 afaik MP3 文件不是 UTF8 编码的,所以你应该使用二进制文件 DownloadHandler.data
!
同样对于系统文件路径,而Path.Combine
不是使用字符串 concat (+ "/")
var savePath = Path.Combine(Application.persistentDataPath, "foo" + ".mp3");
File.WriteAllBytes(savePath, www.downloadHandler.data);
所以总的来说喜欢
IEnumerator GetTheFoo(string path)
{
using (UnityWebRequest www = UnityWebRequest.Get(path))
{
www.SendWebRequest();
while (www.downloadProgress < 1)
{
Debug.Log(www.downloadProgress);
yield return new WaitForSeconds(.1f);
}
if (www.isNetworkError)
{
Debug.Log("error");
}
else
{
var savePath = Path.Combine(Application.persistentDataPath, "foo.mp3");
System.IO.File.WriteAllBytes(savePath, www.downloadHandler.data);
Debug.Log($"File saved to {savePath}", this);
}
}
}
这对我来说非常好用,例如传入
https://file-examples.com/wp-content/uploads/2017/11/file_example_MP3_5MG.mp3
作为参数;)
推荐阅读
- c++ - C ++:将具有任意数量的行和列的文件读入向量的向量中
- php - 使用 Laravel 控制器测试 Stripe Webhook
- javascript - Javascript 随机生成器,在显示所有项目之前不重复
- javascript - 如何创建一个可以像 C# 类/对象一样实例化并在 Vue 组件中使用的 Javascript 类
- api - 使用 instagram graph API 评论和获取其他个人资料的帖子信息
- wordpress - Gutenberg 块中带有媒体查询的内联样式
- create-react-app - 查看在 WSL2 机器上运行的 React 应用程序
- c# - 如何模拟方法调用内部另一个方法的返回
- python-3.x - 用户定义的函数存储在哪里?
- java - 自定义视图的适配器中的 NullPointerException