Beispiel #1
0
        /// <summary>
        /// Edit avatar name/description on the server.
        /// </summary>
        public virtual AsyncWebRequest EditAvatarAsync(AvatarData avatar, string name = null, string description = null)
        {
            var request = new AsyncWebRequest(AvatarSdkMgr.Str(Strings.EditingAvatar));

            byte[] requestBodyData = null;
            using (var requestBody = new MultipartBody()) {
                requestBody.WriteTextField("name", name);
                requestBody.WriteTextField("description", description);
                requestBody.WriteFooter();
                requestBodyData = requestBody.GetRequestBodyData();

                Func <UnityWebRequest> webRequestFactory = () => {
                    var webRequest = UnityWebRequest.Post(avatar.url, " ");
                    webRequest.chunkedTransfer = false;
                    webRequest.method          = "PATCH";
                    webRequest.uploadHandler   = new UploadHandlerRaw(requestBodyData);
                    webRequest.SetRequestHeader(
                        "Content-Type", string.Format("multipart/form-data; boundary=\"{0}\"", requestBody.Boundary)
                        );
                    SetAuthHeaders(webRequest);
                    return(webRequest);
                };

                Debug.LogFormat("Uploading photo...");
                AvatarSdkMgr.SpawnCoroutine(AwaitJsonWebRequest(webRequestFactory, request));
                return(request);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Upload photo and create avatar instance on the server. Calculations will start right away after the photo is uploaded.
        /// </summary>
        public virtual AsyncWebRequest <AvatarData> CreateAvatarWithPhotoAsync(
            string name, string description, byte[] photoBytes, bool forcePowerOfTwoTexture = false,
            PipelineType pipeline = PipelineType.FACE, AvatarResources resources = null
            )
        {
            var request = new AsyncWebRequest <AvatarData> (AvatarSdkMgr.Str(Strings.UploadingPhoto), TrackProgress.UPLOAD);

#if UNITY_2017_1_OR_NEWER
            Func <UnityWebRequest> webRequestFactory = () =>
            {
                List <IMultipartFormSection> formData = new List <IMultipartFormSection>();
                formData.Add(new MultipartFormDataSection("name", name));
                if (!string.IsNullOrEmpty(description))
                {
                    formData.Add(new MultipartFormDataSection("description", description));
                }
                formData.Add(new MultipartFormFileSection("photo", photoBytes, "photo.jpg", "application/octet-stream"));
                formData.Add(new MultipartFormDataSection("preserve_original_texture", (!forcePowerOfTwoTexture).ToString()));
                formData.Add(new MultipartFormDataSection("pipeline", pipeline.GetPipelineTypeName()));

                if (resources != null)
                {
                    formData.Add(new MultipartFormDataSection("pipeline_subtype", pipeline_subtype));
                    formData.Add(new MultipartFormDataSection("resources", CoreTools.GetAvatarCalculationParamsJson(resources)));
                }

                var webRequest = UnityWebRequest.Post(GetUrl("avatars"), formData);
                webRequest.chunkedTransfer = false;
                SetAuthHeaders(webRequest);
                return(webRequest);
            };

            Debug.LogFormat("Uploading photo...");
            AvatarSdkMgr.SpawnCoroutine(AwaitJsonWebRequest(webRequestFactory, request));
            return(request);
#else
            // Unity 5.5.0 (and probably earlier versions) have a weird bug in default multipart form data
            // implementation, which causes incorrect boundaries between data fields. To work around this bug the
            // multipart request body is constructed manually, see below.
            byte[] requestBodyData = null;
            using (var requestBody = new MultipartBody()) {
                requestBody.WriteTextField("name", name);
                requestBody.WriteTextField("description", description);
                requestBody.WriteFileField("photo", "photo.jpg", photoBytes);
                requestBody.WriteTextField("preserve_original_texture", (!forcePowerOfTwoTexture).ToString());
                requestBody.WriteTextField("pipeline", pipeline.GetPipelineTypeName());

                if (resources != null)
                {
                    requestBody.WriteTextField("pipeline_subtype", pipeline_subtype);
                    requestBody.WriteTextField("resources", CoreTools.GetAvatarCalculationParamsJson(resources));
                }

                requestBody.WriteFooter();
                requestBodyData = requestBody.GetRequestBodyData();

                Func <UnityWebRequest> webRequestFactory = () => {
                    var webRequest = UnityWebRequest.Post(GetUrl("avatars"), " ");
                    webRequest.uploadHandler = new UploadHandlerRaw(requestBodyData);
                    webRequest.SetRequestHeader(
                        "Content-Type", string.Format("multipart/form-data; boundary=\"{0}\"", requestBody.Boundary)
                        );
                    webRequest.chunkedTransfer = false;
                    SetAuthHeaders(webRequest);
                    return(webRequest);
                };

                Debug.LogFormat("Uploading photo...");
                AvatarSdkMgr.SpawnCoroutine(AwaitJsonWebRequest(webRequestFactory, request));
                return(request);
            }
#endif
        }