简体   繁体   中英

Does UnityWebRequest.uploadProgress have side effects?

I have the following upload code using Unity's UnityWebRequest API (Unity 2019.2.13f1):

public IEnumerator UploadJobFile(string jobId, string path)
{
    if (!File.Exists(path))
    {
        Debug.LogError("The given file to upload does not exist. Please re-create the recording and try again.");
        yield break;
    }

    UnityWebRequest upload = new UnityWebRequest(hostURL + "/jobs/upload/" + jobId);
    upload.uploadHandler = new UploadHandlerFile(path);
    upload.downloadHandler = new DownloadHandlerBuffer();
    upload.method = UnityWebRequest.kHttpVerbPOST;
    upload.SetRequestHeader("filename", Path.GetFileName(path));

    UnityWebRequestAsyncOperation op = upload.SendWebRequest();
    while (!upload.isDone)
    {
        //Debug.Log("Uploading file...");
        Debug.Log("Uploading file. Progress " + (int)(upload.uploadProgress * 100f) + "%"); // <-----------------
        yield return null;
    }

    if (upload.isNetworkError || upload.isHttpError)
    {
        Debug.LogError("Upload error:\n" + upload.error);
    }
    else
    {
        Debug.Log("Upload success");
    }

    // this is needed to clear resources on the file
    upload.Dispose();
}

string hostURL = "http://localhost:8080";
string jobId = "manualUploadTest";
string path = "E:/Videos/short.mp4";
void Update()
{
    if (Input.GetKeyDown(KeyCode.O))
    {
        Debug.Log("O key was pressed.");
        StartCoroutine(UploadAndTest(jobId, path));
    }
 }

And the files I receive on the server side arrive broken, especially if they are larger (30 MB or more). They are missing bytes in the end and sometimes have entire byte blocks duplicated in the middle.

  • This happens both when testing client and server on the same machine or when running on different machines.
  • The server does not complain - from its perspective, no transport errors happened.

I noticed that if I comment out the access to upload.uploadProgress (and eg instead use the commented-out debug line above it which just prints a string literal), the files stay intact. Ditching the wile loop altogether and replacing it with yield return op also works.

I tested this strange behavior repeatedly in an outer loop - usually after at most 8 repetitions with the "faulty" code, the file appears broken. If I use the "correct" variant, 100 uploads (update: 500) in a row were successful.

Has upload.uploadProgress side-effects? For what it's worth, the same happens if I print op.progress instead - the files are also broken.

This sounds like a real bug. uploadProgress obviously should not have side effects.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM