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; }
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); }
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)); }
/// <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); }
/// <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); }