/// <summary> /// Gets the PreSigned Request to upload a file from the remote server /// </summary> /// <param name="keyName">KeyName of the file for which to generate the presigned request</param> /// <param name="filePath">file path to be uploaded</param> /// <param name="isSingleFile">False if it is a part of Folder upload, true otherwise</param> /// <param name="ErrorCallback">Used only during Folder upload, callback if any error occurs</param> /// <returns></returns> IEnumerator GetPreSignedRequest(string keyName, string filePath, bool isSingleFile, Action <bool, string> ErrorCallback) { bool errorOccured = false; string errorMsg = null; using (UnityWebRequest uwr = UnityWebRequest.Get(amazonS3ServerBackend + "/sign_request?file_name=" + keyName)) { yield return(uwr.SendWebRequest()); if (uwr.result != UnityWebRequest.Result.Success) { if (isSingleFile) { DisplayUploadErrorMessage(uwr.error); } else { ErrorCallback(true, uwr.error + "\n" + keyName); } } else { Debug.Log("Sign Request success for : " + keyName); string resp = uwr.downloadHandler.text; string updatedResp = resp.Replace("x-amz-algorithm", "xamzalgorithm"); updatedResp = updatedResp.Replace("x-amz-credential", "xamzcredential"); updatedResp = updatedResp.Replace("x-amz-date", "xamzdate"); updatedResp = updatedResp.Replace("x-amz-signature", "xamzsignature"); PresignResponse pr = JsonUtility.FromJson <PresignResponse>(updatedResp); yield return(UploadFileToAmazonS3(pr, filePath, isSingleFile, (error, message) => { errorOccured = error; errorMsg = message; })); if (errorOccured) { ErrorCallback(errorOccured, errorMsg); } } } }
/// <summary> /// Actually uploads the file to AmazonS3 after getting a presigned request for that file /// </summary> /// <param name="resp">Response of Presigned Request</param> /// <param name="filePath">Path of the file to be uploaded</param> /// <param name="isSingleFile">False if it is a part of Folder upload, true otherwise</param> /// <param name="ErrorCallback">Used only during Folder upload, callback if any error occurs</param> /// <returns></returns> IEnumerator UploadFileToAmazonS3(PresignResponse resp, string filePath, bool isSingleFile, Action <bool, string> ErrorCallback) { List <IMultipartFormSection> formData = new List <IMultipartFormSection>(); byte[] fileData = FileBrowserHelpers.ReadBytesFromFile(filePath); string filename = FileBrowserHelpers.GetFilename(filePath); formData.Add(new MultipartFormDataSection(nameof(resp.fields.acl), resp.fields.acl)); formData.Add(new MultipartFormDataSection(nameof(resp.fields.key), resp.fields.key)); formData.Add(new MultipartFormDataSection("x-amz-algorithm", resp.fields.xamzalgorithm)); formData.Add(new MultipartFormDataSection("x-amz-credential", resp.fields.xamzcredential)); formData.Add(new MultipartFormDataSection("x-amz-date", resp.fields.xamzdate)); formData.Add(new MultipartFormDataSection(nameof(resp.fields.policy), resp.fields.policy)); formData.Add(new MultipartFormDataSection("x-amz-signature", resp.fields.xamzsignature)); formData.Add(new MultipartFormFileSection("file", fileData, filename, "application/octet-stream")); using (UnityWebRequest uwr = UnityWebRequest.Post(resp.url, formData)) { if (isSingleFile) { uwr.SendWebRequest(); MessageFields uploadMsgFields = DisplayUploadProgressMessage(); StartCoroutine(CheckUploadConnection(uwr)); while (!uwr.isDone) { string progress = "Progress : " + Mathf.Round(uwr.uploadProgress * 100).ToString() + "%"; uploadMsgFields.MessageDetails("Upload Progress ...", progress); if (uwr.isNetworkError || uwr.isHttpError) { DestroyUploadProgressMessage(uploadMsgFields); yield break; } yield return(null); } DestroyUploadProgressMessage(uploadMsgFields); } else { yield return(uwr.SendWebRequest()); } if (uwr.result != UnityWebRequest.Result.Success) { if (isSingleFile) { DisplayUploadErrorMessage(uwr.error); } else { ErrorCallback(true, uwr.error + "\n" + resp.fields.key); } } else { Debug.Log("File Upload Success! : " + filename); //Debug.Log(uwr.GetResponseHeader("Location")); if (filename.EndsWith(TypeGLTF) || filename.EndsWith(TypeGLB)) { gltfUrl = uwr.GetResponseHeader("Location"); gltfUrl = UnityWebRequest.UnEscapeURL(gltfUrl); if (isSingleFile) { yield return(PushUrlToDatabase(gltfUrl)); } } } } }