मैं वास्तविक फ़ाइल पथ लौटाए बिना एपीआई से कुछ डाउनलोड करने योग्य फ़ाइल प्राप्त करने का प्रयास करता हूं, उदाहरण जैसे www.domain.com/api/get-audio?name=foo.mp3, ब्राउज़र में ओपन होने पर फाइल अपने आप डाउनलोड हो जाएगी लेकिन ऐसा लगता है कि यूनिटी में फाइल को डाउनलोड करने में सक्षम होने के लिए कुछ फ़ंक्शन होना चाहिए कुछ इस तरह:

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 पर गहरी खोज कर रहा हूं और मुझे सभी उदाहरण और समाधान दिए गए लिंक के साथ हैं वास्तविक पथ फ़ाइल जैसे फ़ाइल/ऑडियो/foo.mp4, तो एपीआई या लिंक से डाउनलोड करने योग्य फ़ाइल प्राप्त करना संभव है या नहीं जिसमें वास्तविक पथ नहीं है?

[अद्यतन]

१००% मेरी अपनी गलती है, ज्ञान की कमी के लिए खेद है, मुझे नहीं पता कि क्या समय परिणाम बदल देगा, इसलिए बस कुछ सही तर्क के साथ उपज वापसी बदलें या केवल उन्हें बदलें

yield return www.SendWebRequest();

0
good112233 22 जून 2020, 09:48

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 का उपयोग करें स्ट्रिंग कॉन्सैट के बजाय (+ "/")

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

पैरामीटर के रूप में;)

2
derHugo 22 जून 2020, 10:26