123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- /*-------------------------------------------------------------------------
- * 功能描述: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
- {
- /// <summary>
- /// 流传输参数
- /// </summary>
- 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; }
- /// <summary>
- /// 传输是否完成
- /// </summary>
- public bool TransCompleted { get; internal set; }
- }
- public class FileContent
- {
- public int BufferLength { get; set; } = 1024 * 1024;
- /// <summary>
- /// 超时设置
- /// </summary>
- public int Timeout { get; set; } = 60000;
- public EventHandler<StreamProgressArgs> TransferProgress { get; set; }
- }
- /// <summary>
- /// 推送对象内容
- /// </summary>
- public class PutFlieContent : FileContent
- {
- private string m_Url;
- private Stream m_Stream;
- public PutFlieContent(string url, Stream stream)
- {
- m_Url = url;
- m_Stream = stream;
- }
- /// <summary>
- /// 上传文件
- /// </summary>
- /// <returns></returns>
- 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;
- }
- }
- /// <summary>
- /// 获取对象内容
- /// </summary>
- 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;
- }
- }
- }
|