FileContent.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*-------------------------------------------------------------------------
  2. * 功能描述:FileContent
  3. * 作者:xulisong
  4. * 创建时间: 2019/4/23 9:47:51
  5. * 版本号:v1.0
  6. * -------------------------------------------------------------------------*/
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Net;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. namespace SAGA.MBI.Utilities
  15. {
  16. /// <summary>
  17. /// 流传输参数
  18. /// </summary>
  19. public class StreamProgressArgs : EventArgs
  20. {
  21. public StreamProgressArgs(long incrementTransferred, long transferred, long total)
  22. {
  23. IncrementTransferred = incrementTransferred;
  24. TransferredBytes = transferred;
  25. TotalBytes = total;
  26. }
  27. public long IncrementTransferred { get; private set; }
  28. public long TransferredBytes { get; private set; }
  29. public long TotalBytes { get; private set; }
  30. /// <summary>
  31. /// 传输是否完成
  32. /// </summary>
  33. public bool TransCompleted { get; internal set; }
  34. }
  35. public class FileContent
  36. {
  37. public int BufferLength { get; set; } = 1024 * 1024;
  38. /// <summary>
  39. /// 超时设置
  40. /// </summary>
  41. public int Timeout { get; set; } = 60000;
  42. public EventHandler<StreamProgressArgs> TransferProgress { get; set; }
  43. }
  44. /// <summary>
  45. /// 推送对象内容
  46. /// </summary>
  47. public class PutFlieContent : FileContent
  48. {
  49. private string m_Url;
  50. private Stream m_Stream;
  51. public PutFlieContent(string url, Stream stream)
  52. {
  53. m_Url = url;
  54. m_Stream = stream;
  55. }
  56. /// <summary>
  57. /// 上传文件
  58. /// </summary>
  59. /// <returns></returns>
  60. public virtual string PutContent()
  61. {
  62. var url = m_Url;
  63. var stream = m_Stream;
  64. if (stream == null)
  65. throw new ArgumentNullException(nameof(stream));
  66. var responseValue = string.Empty;
  67. HttpWebRequest request = null;
  68. try
  69. {
  70. var totalLength = stream.Length;
  71. request = (HttpWebRequest) WebRequest.Create(url);
  72. request.KeepAlive = true;
  73. request.Timeout = Timeout;
  74. request.Method = "POST";
  75. request.ContentLength = totalLength;
  76. request.ContentType = "multipart/form-data; ";
  77. #region 请求数据
  78. byte[] buffer = new byte[BufferLength];
  79. var transLength = 0;
  80. using (BinaryReader r = new BinaryReader(stream))
  81. {
  82. Stream postStream = request.GetRequestStream();
  83. try
  84. {
  85. int size = 0;
  86. do
  87. {
  88. size = r.Read(buffer, 0, buffer.Length);
  89. postStream.Write(buffer, 0, size);
  90. transLength += size;
  91. #region 调用事件
  92. StreamProgressArgs args = new StreamProgressArgs(size, transLength, totalLength);
  93. args.TransCompleted = (size == (long) 0);
  94. TransferProgress?.Invoke(this, args);
  95. #endregion
  96. } while (size > 0);
  97. }
  98. finally
  99. {
  100. postStream?.Close();
  101. }
  102. }
  103. #endregion
  104. #region 相应数据
  105. //返回数据
  106. using (var response = (HttpWebResponse) request.GetResponse())
  107. {
  108. if (response.StatusCode != HttpStatusCode.OK)
  109. {
  110. var message = String.Format("请求失败. 获得http状态 {0}", response.StatusCode);
  111. throw new ApplicationException(message);
  112. }
  113. using (var responseStream = response.GetResponseStream())
  114. {
  115. if (responseStream != null)
  116. using (var reader = new StreamReader(responseStream))
  117. {
  118. responseValue = reader.ReadToEnd();
  119. }
  120. }
  121. }
  122. #endregion
  123. }
  124. catch (Exception e)
  125. {
  126. throw;
  127. }
  128. finally
  129. {
  130. //request?.dis
  131. }
  132. return responseValue;
  133. }
  134. }
  135. /// <summary>
  136. /// 获取对象内容
  137. /// </summary>
  138. public class GetFlieContent : FileContent
  139. {
  140. private string m_Url;
  141. public GetFlieContent(string url)
  142. {
  143. m_Url = url;
  144. }
  145. public virtual byte[] GetContent()
  146. {
  147. string url = m_Url;
  148. byte[] results = null;
  149. HttpWebRequest request = null ;
  150. try
  151. {
  152. request = (HttpWebRequest)WebRequest.Create(url);
  153. request.KeepAlive = true;
  154. request.Timeout = Timeout;
  155. request.Method = "Get";
  156. using (var response = (HttpWebResponse) request.GetResponse())
  157. {
  158. if (response.StatusCode != HttpStatusCode.OK)
  159. {
  160. var message = String.Format("请求失败. 获取http状态 {0}", response.StatusCode);
  161. throw new ApplicationException(message);
  162. }
  163. #region 获取返回值
  164. using (MemoryStream memoryStream = new MemoryStream())
  165. {
  166. using (var responseStream = response.GetResponseStream())
  167. {
  168. if (responseStream != null)
  169. {
  170. long totalLength = response.ContentLength;
  171. var transLength = 0;
  172. if ((response.Headers.AllKeys.Contains("ContentLength") && totalLength < 0) ||
  173. totalLength == 0) //当没有连接是可能返回长度为0
  174. {
  175. return results;
  176. }
  177. var buffer = new byte[BufferLength]; //缓存对象
  178. var readSize = 0;
  179. while ((readSize = responseStream.Read(buffer, 0, buffer.Length)) > 0)
  180. {
  181. memoryStream.Write(buffer, 0, readSize);
  182. transLength += readSize;
  183. #region 调用事件
  184. StreamProgressArgs args =
  185. new StreamProgressArgs(readSize, transLength, totalLength);
  186. args.TransCompleted = (totalLength == transLength);
  187. TransferProgress?.Invoke(this, args);
  188. #endregion
  189. }
  190. results = memoryStream.ToArray();
  191. if ((totalLength!=-1)&&results.Length != totalLength)
  192. {
  193. throw new Exception("文件下载不完整");
  194. }
  195. }
  196. }
  197. }
  198. #endregion
  199. }
  200. }
  201. catch (Exception ex)
  202. {
  203. throw;
  204. }
  205. return results;
  206. }
  207. }
  208. }