/*-------------------------------------------------------------------------
* 功能描述: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;
}
}
}