首页 > 解决方案 > 是否可以从在 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();

标签: c#apiunity3ddownload

解决方案


你做

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

作为参数;)


推荐阅读