public void NamedFileStreamConstructorTest() { string name = "name"; string filename = "test.jpg"; string contentType = "image/jpeg"; Stream stream = new MemoryStream(); NamedFileStream target = new NamedFileStream(name, filename, contentType, stream); Assert.AreEqual(name, target.Name); Assert.AreEqual(filename, target.Filename); Assert.AreEqual(stream, target.Stream); Assert.AreEqual(contentType, target.ContentType); }
public RequestBuilder Upload(NamedFileStream[] files, object parameters, Action<long,long?> onProgressChanged, Action<long> onUploadComplete) { MultipartBodyProvider bodyProvider = new MultipartBodyProvider(); bodyProvider.OnCompletedCallback = onUploadComplete; bodyProvider.OnProgressChangeCallback = onProgressChanged; foreach (NamedFileStream file in files) { bodyProvider.AddFile(file); } bodyProvider.SetParameters(parameters); return this.Body(bodyProvider); }
public void NamedFileStreamConstructorTest() { var name = "name"; var filename = "test.jpg"; var contentType = "image/jpeg"; var stream = new MemoryStream(); var target = new NamedFileStream(name, filename, contentType, stream); Assert.AreEqual(name, target.Name); Assert.AreEqual(filename, target.Filename); Assert.AreEqual(stream, target.Stream); Assert.AreEqual(contentType, target.ContentType); }
public void AddFile(NamedFileStream file) { files.Add(file); }
public RequestBuilder Upload(NamedFileStream[] files, Action<long, long?> onProgressChanged) { return this.Upload(files, new { }, onProgressChanged, a => { }); }
public RequestBuilder Upload(NamedFileStream[] files) { return this.Upload(files, new { }); }
public RequestBuilder Upload(NamedFileStream[] files, object parameters) { return this.Upload(files, parameters,(a,b)=> { }, a=>{ }); }
public void SetUp() { stream = new MemoryStream(); fs = new NamedFileStream("n", "fn", "ct", stream); }
/// <summary> /// 异步上传文件 /// </summary> /// <param name="url">url地址</param> /// <param name="files">文件信息</param> /// <param name="parameters">请求参数</param> /// <param name="method">请求方法</param> /// <param name="contentType">contentType</param> /// <param name="header">header</param> /// <returns>Task</returns> public static Task<HttpResult> UploadTask(string url, NamedFileStream[] files, object parameters = null, HttpVerb method = HttpVerb.Post, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) { var cts = new TaskCompletionSource<HttpResult>(); Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, files, (result) => { if (result.IsFaulted) cts.SetException(result.Exception); else if (result.IsCanceled) cts.SetCanceled(); else if (result.IsCompleted) cts.SetResult(result); }); return cts.Task; }
/// <summary> /// 异步上传文件 /// </summary> /// <param name="url">url地址</param> /// <param name="files">文件信息</param> /// <param name="callback">回调函数</param> /// <param name="parameters">请求参数</param> /// <param name="method">请求方法</param> /// <param name="contentType">contentType</param> /// <param name="header">header</param> public static void Upload(string url, NamedFileStream[] files, Action<byte[]> callback, object parameters = null, HttpVerb method = HttpVerb.Post, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) { Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, files, StreamToBytesCallback(callback)); }
/// <summary> /// Http异步请求发送 /// </summary> /// <param name="httpParam">请求参数</param> /// <param name="files">文件上传的信息</param> /// <param name="callback">返回请求响应结果回调</param> public static void Request(HttpParam httpParam, NamedFileStream[] files, Action<HttpResult> callback) { if (httpParam == null) { throw new ArgumentException("httpParam not null"); } if (httpParam.Method != HttpVerb.Post && httpParam.Method != HttpVerb.Put) { throw new ArgumentException("Request method must be POST or PUT"); } if (string.IsNullOrWhiteSpace(httpParam.URL)) { throw new ArgumentException("url not null"); } //使用回调的方法进行证书验证。 if (httpParam.RemoteCertificateValidationCallback != null) ServicePointManager.ServerCertificateValidationCallback = httpParam.RemoteCertificateValidationCallback; Encoding encoding = DefaultEncoding; if (httpParam.Encoding != null) encoding = httpParam.Encoding; if (files.Length == 0) throw new ArgumentException("files is empty"); HttpWebRequest request = null; //设置分界线 string boundary = RandomString(12); try { request = (HttpWebRequest)HttpWebRequest.Create(new Uri(httpParam.URL)); SetRequest(request, httpParam); request.ContentType = "multipart/form-data; boundary=" + boundary; //开始异步请求 request.BeginGetRequestStream(new AsyncCallback((callbackResult) => { HttpWebRequest _request = (HttpWebRequest)callbackResult.AsyncState; var requestStream = _request.EndGetRequestStream(callbackResult); //转化网络流对象进行直接射入,省内存 using (StreamWriter writer = new StreamWriter(requestStream, encoding)) { try { IDictionary postbody = SerializeQuery(httpParam.Parameters); string newLine = "\r\n"; //处理form-data if (postbody != null) { foreach (string key in postbody.Keys) { if (postbody[key] != null) { writer.Write("--" + boundary + newLine); writer.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}", key, newLine); writer.Write(postbody[key] + newLine); writer.Flush(); } } } //处理文件流 foreach (var file in files) { writer.Write("--" + boundary + newLine); writer.Write( "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.FileName, newLine ); writer.Write("Content-Type: application/octet-stream" + newLine + newLine); writer.Flush(); //复制文件流到Body CopyStream(file.Stream, requestStream); writer.Write(newLine); writer.Write("--" + boundary + newLine); writer.Flush(); } } catch (Exception ex) { requestStream.Dispose(); ProcessFailCallback(callback, ex); return; } finally { //使用完后释放 foreach (var file in files) if (file.Stream != null) file.Stream.Dispose(); } } //异步接收响应,并且设置一个超时时间 IAsyncResult asyncResult = _request.BeginGetResponse(null, _request); asyncResult.FromAsync((ia, isTimeout) => { if (isTimeout) { ProcessFailCallback(callback, new TimeoutException("Connection Timeout")); } else { ProcessCallback(ia, callback); } }, httpParam.Timeout); }), request); } catch (WebException exception) { //遇到异常时候再次释放一次,防止内存泄漏 foreach (var file in files) if (file.Stream != null) file.Stream.Dispose(); if (request != null) request.Abort(); ProcessFailCallback(callback, exception); } }
/// <summary> /// Http异步请求发送 /// </summary> /// <param name="httpParam">请求参数</param> /// <param name="files">文件上传的信息</param> /// <param name="callback">返回请求响应结果回调</param> /// <param name="userState">状态</param> public static void Request(HttpParam httpParam, NamedFileStream[] files, Action<HttpResult, object> callback, object userState) { Request(httpParam, files, (result) => callback(result, userState)); }
/// <summary> /// 上传文件 /// </summary> /// <param name="url">url地址</param> /// <param name="files">文件信息</param> /// <param name="parameters">请求参数</param> /// <param name="method">请求方法</param> /// <param name="contentType">contentType</param> /// <param name="header">WebHeaderCollection</param> /// <returns>return string</returns> public static string UploadToString(string url, NamedFileStream[] files, object parameters = null, HttpVerb method = HttpVerb.Post, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null) { var result = Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, files); return result.ToStringResult(); }
/// <summary> /// Http请求发送文件 /// </summary> /// <param name="httpParam">请求参数</param> /// <param name="files">文件上传的信息</param> /// <returns>返回请求响应结果</returns> public static HttpResult Request(HttpParam httpParam, NamedFileStream[] files) { if (httpParam == null) { throw new ArgumentException("httpParam not null"); } if (httpParam.Method != HttpVerb.Post && httpParam.Method != HttpVerb.Put) { throw new ArgumentException("Request method must be POST or PUT"); } if (string.IsNullOrWhiteSpace(httpParam.URL)) { throw new ArgumentException("url not null"); } //使用回调的方法进行证书验证。 if (httpParam.RemoteCertificateValidationCallback != null) ServicePointManager.ServerCertificateValidationCallback = httpParam.RemoteCertificateValidationCallback; Encoding encoding = DefaultEncoding; if (httpParam.Encoding != null) encoding = httpParam.Encoding; if (files.Length == 0) throw new ArgumentException("files is empty"); HttpWebRequest request = null; //设置分界线 string boundary = RandomString(12); try { request = (HttpWebRequest)HttpWebRequest.Create(new Uri(httpParam.URL)); SetRequest(request, httpParam); request.ContentType = "multipart/form-data; boundary=" + boundary; var requestStream = request.GetRequestStream(); //转化网络流对象进行直接射入,省内存 using (StreamWriter writer = new StreamWriter(requestStream, encoding)) { try { IDictionary postbody = SerializeQuery(httpParam.Parameters); string newLine = "\r\n"; //处理form-data if (postbody != null) { foreach (string key in postbody.Keys) { if (postbody[key] != null) { writer.Write("--" + boundary + newLine); writer.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}", key, newLine); writer.Write(postbody[key] + newLine); writer.Flush(); } } } //处理文件 foreach (var file in files) { writer.Write("--" + boundary + newLine); writer.Write( "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.FileName, newLine ); writer.Write("Content-Type: application/octet-stream" + newLine + newLine); writer.Flush(); //复制文件流到Body CopyStream(file.Stream, requestStream); writer.Write(newLine); writer.Write("--" + boundary + newLine); writer.Flush(); } } catch (Exception ex) { requestStream.Dispose(); //LogContext.GetLogger<HttpRequest>().Error(ex.Message, ex); return new HttpResult { Exception = ex, IsFaulted = true }; } finally { //使用完后释放 foreach (var file in files) { if (file.Stream != null) file.Stream.Dispose(); } } } return Process((HttpWebResponse)request.GetResponse()); } catch (WebException exception) { if (request != null) request.Abort(); //遇到异常时候再次释放一次,防止内存泄漏 foreach (var file in files) { if (file.Stream != null) file.Stream.Dispose(); } //LogContext.GetLogger<HttpRequest>().Error(exception.Message, exception); return new HttpResult { Exception = exception, IsFaulted = true }; } }