private async Task HandleUpload(IOwinContext context)
        {
            var dataStream = new MultiPartFormDataStream(context.Request.Body, context.Request.ContentType);

            if (dataStream.SeekNextFile())
            {
                var zipPackage = new ZipPackage(dataStream);

                if (!await Authenticate(context, zipPackage.Id))
                {
                    return;
                }

                await _repository.AddPackageAsync(zipPackage);
            }
        }
Ejemplo n.º 2
0
        public ComplitionPromise <string[]> SendFilesToStorage(StorageFile[] storageFiles, Action <float> progress)
        {
            ComplitionDeferred <string[]> deferred = new ComplitionDeferred <string[]>();

            if (storageFiles.Length == 0)
            {
                deferred.Resolve(new string[0]);
                return(deferred.Promise());
            }
            string boundary = "----WebKitFormBoundaryS3pOJgmMVoMmQZ9Y";
            MultiPartFormDataStream dataStream = new MultiPartFormDataStream(boundary, storageFiles.Select((file, i) =>
            {
                MultiPartParameter[] multiPartParameters = new MultiPartParameter[4];
                multiPartParameters[0] = new StreamMultiPartParameter(boundary, string.Format("fileItems[{0}].fileToUpload", i), file.FileName, file.Stream);
                multiPartParameters[1] = new StringMultiPartParameter(boundary, string.Format("fileItems[{0}].path", i), file.Path);
                multiPartParameters[2] = new StringMultiPartParameter(boundary, string.Format("fileItems[{0}].replacing", i), "true");
                multiPartParameters[3] = new StringMultiPartParameter(boundary, string.Format("fileItems[{0}].extract", i), "false");
                return(multiPartParameters);
            }).SelectMany(parameters => parameters).ToArray());

/*            using (FileStream test = File.Create(@"d:\1.log"))
 *          {
 *              dataStream.CopyTo(test);
 *
 *          }
 *          return null;*/
            string      authenticationId        = InfoResolver.Resolve <BacktoryInfo>().AuthenticationId;
            string      authenticationMasterKey = EditorInfoResolver.Resolve <BacktoryEditorInfo>().AuthenticationMasterKey;
            string      storageId  = EditorInfoResolver.Resolve <BacktoryEditorInfo>().StorageId;
            string      url        = "https://storage.backtory.com/files";
            IDispatcher dispatcher = EditorDispatcher.Dispatcher;

            ThreadPool.QueueUserWorkItem(state =>
            {
                MasterLogin(authenticationId, authenticationMasterKey).Then(response =>
                {
                    try
                    {
                        string authorization      = string.Format("{0} {1}", response.TokenType, response.AccessToken);
                        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url));
                        webRequest.KeepAlive      = true;
                        webRequest.Method         = "POST";

                        webRequest.ContentType = "multipart/form-data; boundary=" + boundary;
                        webRequest.Headers.Add("x-backtory-storage-id", storageId);
                        webRequest.Headers.Add("Authorization", authorization);
                        webRequest.ContentLength = dataStream.Length;
                        using (System.IO.Stream requestStream = webRequest.GetRequestStream())
                        {
                            int bytesRead;
                            byte[] buffer  = new byte[2048];
                            long wroteSize = 0;
                            while ((bytesRead = dataStream.Read(buffer, 0, buffer.Length)) != 0)
                            {
                                requestStream.Write(buffer, 0, bytesRead);
                                wroteSize           += bytesRead;
                                float normalPosition = (float)wroteSize / dataStream.Length;
                                dispatcher.Dispach(() =>
                                {
                                    progress(normalPosition);
                                });
                            }
                            using (WebResponse webResponse = webRequest.GetResponse())
                            {
                                using (System.IO.Stream responseStream = webResponse.GetResponseStream())
                                {
                                    using (StreamReader reader = new StreamReader(responseStream))
                                    {
                                        string readToEnd = reader.ReadToEnd();
                                        BacktoryStorageResoponce backtoryStorageResoponce = JsonConvert.DeserializeObject <BacktoryStorageResoponce>(readToEnd);
                                        foreach (StorageFile storageFile in storageFiles)
                                        {
                                            storageFile.Stream.Close();
                                        }
                                        dispatcher.Dispach(() => deferred.Resolve(backtoryStorageResoponce.SavedFilesUrls));
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        foreach (StorageFile storageFile in storageFiles)
                        {
                            storageFile.Stream.Close();
                        }
                        Debug.LogException(e);
                        dispatcher.Dispach(() => deferred.Reject());
                    }
                }, () =>
                {
                    foreach (StorageFile storageFile in storageFiles)
                    {
                        storageFile.Stream.Close();
                    }
                    dispatcher.Dispach(() => deferred.Reject());
                });
            });
            return(deferred.Promise());
        }