можно ли получить/загрузить файл по ссылкам API, у которых нет реального пути к файлу в Unity3D?

я пытаюсь получить загружаемый файл из 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);
        }
    }
}

я получил файл, но после того, как я проверил файл, он возвращает неправильный размер и, возможно, не звуковой файл, потому что я не могу его воспроизвести, я глубоко ищу в Google лучший способ загрузки файла, и я вижу, что все примеры и решения приведены со ссылкой на файл реального пути, такой как file/audio/foo.mp4, так что возможно или нет получить загружаемый файл из API или ссылку, которая не содержит реального пути?

[ОБНОВЛЕНИЕ]

100% - это моя вина, извините за недостаток знаний, я не знаю, изменит ли время результат, поэтому просто измените yield return с некоторой правильной логикой или просто замените их только

yield return www.SendWebRequest();


person good112233    schedule 22.06.2020    source источник
comment
while (www.downloadProgress < 0.01) Итак, вы ждете, пока загрузка не достигнет 1%?   -  person Cid    schedule 22.06.2020
comment
я получил пример из этого ответа answers.unity.com/questions/1574355/   -  person good112233    schedule 22.06.2020
comment
Вы читали комментарий к ответу, указанному в ссылке?   -  person Cid    schedule 22.06.2020
comment
да, он сказал, что я заставил это работать, используя следующий код, вы думаете, что код неверен?   -  person good112233    schedule 22.06.2020
comment
хорошо, я попробую   -  person good112233    schedule 22.06.2020
comment
отлично, вы правы, это моя ошибка. измените yield return исправление, которое   -  person good112233    schedule 22.06.2020


Ответы (1)


Вы делаете

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

как параметр ;)

person derHugo    schedule 22.06.2020
comment
отлично, вы правы, это моя ошибка. измените это return yield и поблагодарите за правильный синтаксис. Мне очень жаль за мою ошибку - person good112233; 22.06.2020