static WWWForm BuildForm(byte[] file, ThumbnailUploadPolicy policy)
        {
            var form = new WWWForm();

            foreach (var field in policy.form)
            {
                form.AddField(field.Key, field.Value.ToString());
            }

            form.AddBinaryData("file", file, policy.fileName, policy.contentType);
            return(form);
        }
        IEnumerator Upload()
        {
            isProcessing = true;

            var getPolicyUrl        = $"{Constants.VenueApiBaseUrl}/v1/upload/venue/thumbnail/policies";
            var getPolicyWebRequest =
                ClusterApiUtil.CreateUnityWebRequest(accessToken, getPolicyUrl, UnityWebRequest.kHttpVerbPOST);

            getPolicyWebRequest.downloadHandler = new DownloadHandlerBuffer();
            getPolicyWebRequest.uploadHandler   =
                new UploadHandlerRaw(Encoding.UTF8.GetBytes(JsonUtility.ToJson(payload)));

            getPolicyWebRequest.SendWebRequest();
            while (!getPolicyWebRequest.isDone)
            {
                yield return(null);
            }

            if (getPolicyWebRequest.isNetworkError)
            {
                HandleError(new Exception(getPolicyWebRequest.error));
            }
            else if (getPolicyWebRequest.isHttpError)
            {
                HandleError(new Exception(getPolicyWebRequest.downloadHandler.text));
            }
            else
            {
                var json = getPolicyWebRequest.downloadHandler.text;

                ThumbnailUploadPolicy policy = null;
                try
                {
                    policy = JsonConvert.DeserializeObject <ThumbnailUploadPolicy>(json);
                }
                catch (Exception e)
                {
                    HandleError(e);
                    yield break;
                }

                byte[] fileBytes = null;
                try
                {
                    fileBytes = ReadFile(filePath);
                }
                catch (Exception e)
                {
                    HandleError(e);
                    yield break;
                }

                if (policy == null || fileBytes == null)
                {
                    HandleError(new Exception("unknown error"));
                    yield break;
                }

                var form = BuildForm(fileBytes, policy);
                var uploadFileWebRequest = UnityWebRequest.Post(policy.uploadUrl, form);
                uploadFileWebRequest.chunkedTransfer = false;

                uploadFileWebRequest.SendWebRequest();
                while (!uploadFileWebRequest.isDone)
                {
                    yield return(null);
                }

                if (uploadFileWebRequest.isNetworkError)
                {
                    HandleError(new Exception(uploadFileWebRequest.error));
                }
                else if (uploadFileWebRequest.isHttpError)
                {
                    HandleError(new Exception(uploadFileWebRequest.downloadHandler.text));
                }
                else
                {
                    Debug.Log("Success Upload Thumbnail");
                    onSuccess?.Invoke(policy);
                }
            }

            isProcessing = false;
        }