/*------------------------------------------------------------------------- * 功能描述:FileContent * 作者:xulisong * 创建时间: 2019/4/23 9:47:51 * 版本号:v1.0 * -------------------------------------------------------------------------*/ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace SAGA.MBI.Utilities { /// /// 流传输参数 /// public class StreamProgressArgs : EventArgs { public StreamProgressArgs(long incrementTransferred, long transferred, long total) { IncrementTransferred = incrementTransferred; TransferredBytes = transferred; TotalBytes = total; } public long IncrementTransferred { get; private set; } public long TransferredBytes { get; private set; } public long TotalBytes { get; private set; } /// /// 传输是否完成 /// public bool TransCompleted { get; internal set; } } public class FileContent { public int BufferLength { get; set; } = 1024 * 1024; /// /// 超时设置 /// public int Timeout { get; set; } = 60000; public EventHandler TransferProgress { get; set; } } /// /// 推送对象内容 /// public class PutFlieContent : FileContent { private string m_Url; private Stream m_Stream; public PutFlieContent(string url, Stream stream) { m_Url = url; m_Stream = stream; } /// /// 上传文件 /// /// public virtual string PutContent() { var url = m_Url; var stream = m_Stream; if (stream == null) throw new ArgumentNullException(nameof(stream)); var responseValue = string.Empty; HttpWebRequest request = null; try { var totalLength = stream.Length; request = (HttpWebRequest) WebRequest.Create(url); request.KeepAlive = true; request.Timeout = Timeout; request.Method = "POST"; request.ContentLength = totalLength; request.ContentType = "multipart/form-data; "; #region 请求数据 byte[] buffer = new byte[BufferLength]; var transLength = 0; using (BinaryReader r = new BinaryReader(stream)) { Stream postStream = request.GetRequestStream(); try { int size = 0; do { size = r.Read(buffer, 0, buffer.Length); postStream.Write(buffer, 0, size); transLength += size; #region 调用事件 StreamProgressArgs args = new StreamProgressArgs(size, transLength, totalLength); args.TransCompleted = (size == (long) 0); TransferProgress?.Invoke(this, args); #endregion } while (size > 0); } finally { postStream?.Close(); } } #endregion #region 相应数据 //返回数据 using (var response = (HttpWebResponse) request.GetResponse()) { if (response.StatusCode != HttpStatusCode.OK) { var message = String.Format("请求失败. 获得http状态 {0}", response.StatusCode); throw new ApplicationException(message); } using (var responseStream = response.GetResponseStream()) { if (responseStream != null) using (var reader = new StreamReader(responseStream)) { responseValue = reader.ReadToEnd(); } } } #endregion } catch (Exception e) { throw; } finally { //request?.dis } return responseValue; } } /// /// 获取对象内容 /// public class GetFlieContent : FileContent { private string m_Url; public GetFlieContent(string url) { m_Url = url; } public virtual byte[] GetContent() { string url = m_Url; byte[] results = null; HttpWebRequest request = null ; try { request = (HttpWebRequest)WebRequest.Create(url); request.KeepAlive = true; request.Timeout = Timeout; request.Method = "Get"; using (var response = (HttpWebResponse) request.GetResponse()) { if (response.StatusCode != HttpStatusCode.OK) { var message = String.Format("请求失败. 获取http状态 {0}", response.StatusCode); throw new ApplicationException(message); } #region 获取返回值 using (MemoryStream memoryStream = new MemoryStream()) { using (var responseStream = response.GetResponseStream()) { if (responseStream != null) { long totalLength = response.ContentLength; var transLength = 0; if ((response.Headers.AllKeys.Contains("ContentLength") && totalLength < 0) || totalLength == 0) //当没有连接是可能返回长度为0 { return results; } var buffer = new byte[BufferLength]; //缓存对象 var readSize = 0; while ((readSize = responseStream.Read(buffer, 0, buffer.Length)) > 0) { memoryStream.Write(buffer, 0, readSize); transLength += readSize; #region 调用事件 StreamProgressArgs args = new StreamProgressArgs(readSize, transLength, totalLength); args.TransCompleted = (totalLength == transLength); TransferProgress?.Invoke(this, args); #endregion } results = memoryStream.ToArray(); if ((totalLength!=-1)&&results.Length != totalLength) { throw new Exception("文件下载不完整"); } } } } #endregion } } catch (Exception ex) { throw; } return results; } } }