public UploadedFileInfo TransmitFile(RestHost host, string url, UploadedFile file,Action<FileUploadProgress> progressAction,
            Action<HttpWebRequest> adjustRequest)
        {

            int totalChunks = (int)Math.Ceiling((double)file.FileData.Length / MAX_CHUNK_SIZE_BYTES);
            int currentChunk = 1;
            UploadedFileInfo fileResponse = new UploadedFileInfo(file.UploadContext);
            using (var rdr = new BinaryReader(file.FileData))
                
                for(var i =currentChunk;i<= totalChunks;i++)
                {
                    FileUploadProgress progress = new FileUploadProgress() {UploadContext = file.UploadContext };
                    string boundary = Guid.NewGuid().ToString("N");
                    var chunk = rdr.ReadBytes(MAX_CHUNK_SIZE_BYTES);
                    var bytesToSend = PrepareDataChunk(chunk, currentChunk, boundary, totalChunks, file);

                    var request = CreateRequest(host, url, adjustRequest, host.PostTimeout);
                    request.Method = "POST";
         
                        try
                        {

                            request.ContentType = "multipart/form-data; boundary=" + boundary;
                            request.ContentLength = bytesToSend.Length;
                            using (var requestStream = request.GetRequestStream())
                            {
                                requestStream.Write(bytesToSend, 0, bytesToSend.Length);
                               
                                requestStream.Close();
                            }

                            using (var response = (HttpWebResponse)request.GetResponse())
                            {
                                var stream = response.GetResponseStream();
                                if (stream != null)
                                {
                                   using (var reader = new StreamReader(stream))
                                    {
                                        var responseData = reader.ReadToEnd();
                                        if (!string.IsNullOrEmpty(responseData))
                                        {
                                            var uploadResponse = JsonConvert.Deserialize(responseData);
                                            fileResponse.DownloadUrl = uploadResponse.result.downloadUrl;
                                        }
                                    }
                                }
                            }


                            if (progressAction != null)
                                progressAction(progress);

                            currentChunk ++;
                            
                        }
                        catch (Exception  ex)
                        {

                            fileResponse.IsError = true;
                            fileResponse.Message =ex.Message;
                            var webException =  ex as WebException;
                            if (webException != null)
                            {
                                var errorResponse = webException.Response as HttpWebResponse;
                                if (errorResponse != null && errorResponse.StatusCode == HttpStatusCode.InternalServerError)
                                {
                                    var resp =  ReadUploadError(errorResponse.GetResponseStream());
                                    if (resp != null && resp.error != null)
                                    {
                                        fileResponse.Message = resp.error.message;
                                    }

                                }
                            }
                        }
                        
                }
            return fileResponse;
        }
        public async Task<UploadedFileInfo> TransmitFileAsync(RestHost host, string url, UploadedFile file, Action<FileUploadProgress> progressAction,
             Action<HttpWebRequest> adjustRequest)
        {
            ExceptionDispatchInfo capturedException = null;
            int totalChunks = (int)Math.Ceiling((double)file.FileData.Length / MAX_CHUNK_SIZE_BYTES);
            int currentChunk = 1;
            UploadedFileInfo fileResponse = new UploadedFileInfo(file.UploadContext);
            using (var rdr = new BinaryReader(file.FileData))

                for (var i = currentChunk; i <= totalChunks; i++)
                {
                    FileUploadProgress progress = new FileUploadProgress() { UploadContext = file.UploadContext };
                    string boundary = Guid.NewGuid().ToString("N");
                    var chunk = rdr.ReadBytes(MAX_CHUNK_SIZE_BYTES);
                    var bytesToSend = PrepareDataChunk(chunk, currentChunk, boundary, totalChunks, file);

                    var request = CreateRequest(host, url, adjustRequest, host.PostTimeout);
                    request.Method = "POST";

                    try
                    {

                        request.ContentType = "multipart/form-data; boundary=" + boundary;
                        request.ContentLength = bytesToSend.Length;
                        using (var requestStream =await  request.GetRequestStreamAsync())
                        {
                            await requestStream.WriteAsync(bytesToSend, 0, bytesToSend.Length);

                            requestStream.Close();
                        }

                        using (HttpWebResponse response =  (HttpWebResponse)await request.GetResponseAsync())
                        {
                            var str = response.GetResponseStream();
                        }


                        if (progressAction != null)
                            progressAction(progress);

                        currentChunk++;

                    }
                    catch (Exception ex)
                    {

                        capturedException = ExceptionDispatchInfo.Capture(ex);
                    }

                    if (capturedException != null )
                    {
                        fileResponse.IsError = true;
                        fileResponse.Message = capturedException.SourceException.Message;
                        var webException = capturedException.SourceException as WebException;
                        if (webException != null  )
                        {
                            var errorResponse = webException.Response as HttpWebResponse;
                            if (errorResponse != null && errorResponse.StatusCode == HttpStatusCode.InternalServerError)
                            {
                                var resp = await ReadUploadErrorAsync(errorResponse.GetResponseStream());
                                if (resp != null && resp.error != null)
                                {
                                    fileResponse.Message = resp.error.message;
                                }

                            }
                        }
                    }

                }
            return fileResponse;
        }
        private byte[] PrepareDataChunk(byte[] chunk,int currentChunk,string boundary,int totalChunks,UploadedFile file)
        {
            StringBuilder sb = new StringBuilder();
            string fmtFileName = !String.IsNullOrEmpty(file.FileName) ? file.FileName.Remove(0, file.FileName.LastIndexOf("\\") + 1) : "noname";


            sb.Append(GetMultipartFormdata(boundary, "name", fmtFileName));
            sb.Append(GetMultipartFormdata(boundary, "chunk", currentChunk.ToString()));
            sb.Append(GetMultipartFormdata(boundary, "chunks", totalChunks.ToString()));
            sb.Append(GetFileMultipartFormdataFile(boundary, file.FileName, file.ContentType));

            var startDataBytes = Encoding.UTF8.GetBytes(sb.ToString());
            var endDataBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");

            byte[] bytesToSend = new byte[startDataBytes.Length + chunk.Length + endDataBytes.Length];
            startDataBytes.CopyTo(bytesToSend, 0);
            chunk.CopyTo(bytesToSend, startDataBytes.Length);
            endDataBytes.CopyTo(bytesToSend, startDataBytes.Length + chunk.Length);

            return bytesToSend;
        }
Exemple #4
0
        public void when_uploading_file_less_15mb()
        {
            var ms = new MemoryStream();
            StreamWriter sw = new StreamWriter(ms);

            sw.Write(_data);
            sw.Flush();
            ms.Position = 0;

            Guid context = Guid.NewGuid();
            var rest = new Telligent.Evolution.RestSDK.Implementations.Rest(new RestCommunicationProxy());
            var file = new UploadedFile(context, "declaration.txt", "text\\plain", ms);
              var info=  rest.TransmitFile(Host, file, new RestFileOptions());

            ms.Close();
            ms.Dispose();

            sw.Close();
            sw.Dispose();

            Assert.IsNotNull(info);
            Assert.IsFalse(info.IsError);
            Assert.IsNullOrEmpty(info.Message);
        }
Exemple #5
0
        public Task<UploadedFileInfo> TransmitFileAsync(RestHost host, UploadedFile file, RestFileOptions options = null)
        {
            if (options == null)
                options = new RestFileOptions();

            string url = GetUploadUrl(host.EvolutionRootUrl, file.UploadContext);
            return _proxy.TransmitFileAsync(host, url, file, options.UploadProgress,
                (request) => AdjustFileRequest(host, request, options));


        }
Exemple #6
0
 /// <summary>
 /// Uploads a file to your community site for use in later requests such as attachments(Async)
 /// </summary>
 /// <param name="file">A file defintition object</param>
 /// <param name="options">Additional optional items for this request type</param>
 /// <returns>UploadedFileInfo</returns>
 public Task<UploadedFileInfo> UploadFileAsync(UploadedFile file, RestFileOptions options = null)
 {
     return Rest.TransmitFileAsync(this, file, options);
 }
Exemple #7
0
 /// <summary>
 /// Uploads a file to your community site for use in later requests such as attachments
 /// </summary>
 /// <param name="file">A file defintition object</param>
 /// <param name="options">Additional optional items for this request type</param>
 /// <returns>UploadedFileInfo</returns>
 public UploadedFileInfo UploadFile(UploadedFile file, RestFileOptions options = null)
 {
     return Rest.TransmitFile(this, file, options);
 }