Пример #1
0
    /// <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);
                }
            }
        }
    }
Пример #2
0
    /// <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));
                    }
                }
            }
        }
    }