zoukankan      html  css  js  c++  java
  • C# HttpWebRequest可断点上传,下载文件;SOCKET多线程多管道可断点传送大文件

    SOCKET多线程多管道可断点传送大文件 http://www.cnblogs.com/Googler/archive/2010/06/03/1750616.html

     

    HttpWebRequest
    using System;
    using System.Net;
    using System.Web;
    using System.IO;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Collections.Generic;
    using System.Text;

    namespace Rocky.Net
    {
    public class HttpWalker
    {
    #region StaticMembers
    public static void DownloadFile(HttpContext context, string filePath)
    {
    AppRuntime.Guard
    <ArgumentNullException>(context == null);
    HttpRequest Request
    = context.Request;
    HttpResponse Response
    = context.Response;
    Response.Clear();
    Response.Buffer
    = false;
    Response.AddHeader(
    "Accept-Ranges", "bytes");
    using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    byte[] buffer = BufferUtility.GetBuffer((int)stream.Length);
    long p = 0L, l = stream.Length;
    #region Resolve Range
    string range = Request.Headers["Range"];
    if (range != null)
    {
    //Range:bytes=1024-
    //Range:bytes=1024-2048
    //Range:bytes=-1024
    //Range:bytes=0-512,1024-2048
    int index = range.IndexOf("=");
    if (index != -1)
    {
    string[] ranges = range.Substring(index + 1).Split(',');
    if (ranges.Length > 1)
    {
    //not supported multipart/byterange
    }
    else
    {
    bool flag = false;
    if (ranges[0].StartsWith("-"))
    {
    long _p, _absp;
    if (long.TryParse(ranges[0], out _p) && (_absp = Math.Abs(_p)) <= l)
    {
    if (_p < 0)
    {
    p
    = l - _absp;
    l
    = _absp;
    flag
    = true;
    }
    }
    }
    else
    {
    ranges
    = ranges[0].Split('-');
    if (ranges.Length == 2)
    {
    long _p, _l;
    if (ranges[1] == string.Empty)
    {
    if (long.TryParse(ranges[0], out _p) && _p <= l)
    {
    p
    = _p;
    flag
    = true;
    }
    }
    else if (long.TryParse(ranges[0], out _p) && long.TryParse(ranges[1], out _l) && _p > 0 && _l > 0 && _p < _l && _l < l)
    {
    p
    = _p;
    l
    = _l + 1;
    flag
    = true;
    }
    }
    }
    if (flag)
    {
    Response.StatusCode
    = 206;
    Response.AddHeader(
    "Content-Range", "bytes " + p.ToString() + "-" + l.ToString() + "/" + stream.Length.ToString());
    }
    else
    {
    Response.StatusCode
    = 416; //Requested range not satisfiable
    }
    }
    }
    }
    #endregion
    Response.AddHeader(
    "Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(Path.GetFileName(filePath), Encoding.UTF8));
    Response.AddHeader(
    "Content-Length", l.ToString());
    Response.ContentType
    = "application/octet-stream";
    stream.Position
    = p;
    int read;
    while (Response.IsClientConnected && p < l)
    {
    Response.OutputStream.Write(buffer,
    0, read = stream.Read(buffer, 0, buffer.Length));
    Response.Flush();
    p
    += read;
    }
    }
    Response.End();
    }

    public static void UploadFile(HttpContext context, string savePath)
    {
    AppRuntime.Guard
    <ArgumentNullException>(context == null);
    HttpRequest Request
    = context.Request;
    HttpResponse Response
    = context.Response;
    string msg = "0", fileName = Request.Headers["filename"];
    if (fileName != null)
    {
    FileInfo file
    = new FileInfo(Path.Combine(Path.GetDirectoryName(savePath), fileName));
    if (Request.Headers["breakpoint"] == bool.TrueString)
    {
    Response.AddHeader(
    "Content-Length", (file.Exists ? file.Length : 0L).ToString());
    }
    else
    {
    long l;
    if (Request.Files.Count > 0 && long.TryParse(Request.Headers["breakpoint"], out l))
    {
    HttpPostedFile postedFile
    = Request.Files[0];
    using (FileStream stream = file.Open(file.Exists ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.None))
    {
    byte[] buffer = BufferUtility.GetBuffer((int)stream.Length);
    Stream postedStream
    = postedFile.InputStream;
    long p = stream.Position;
    int read;
    while (Response.IsClientConnected && p < l)
    {
    stream.Write(buffer,
    0, read = postedStream.Read(buffer, 0, buffer.Length));
    stream.Flush();
    p
    += read;
    }
    }
    file.MoveTo(savePath);
    msg
    = "1";
    }
    }
    }
    Response.Write(msg);
    Response.End();
    }
    #endregion

    #region Fields
    private HttpWebRequest httpRequest;
    private CookieContainer cookieContainer;
    private string referer;
    private NameValueCollection form;
    private List<HttpFile> files;
    #endregion

    #region Properties
    public Uri RequestUri
    {
    set { httpRequest = (HttpWebRequest)WebRequest.Create(value); }
    get { return httpRequest.RequestUri; }
    }
    public HttpWebRequest Request
    {
    get { return httpRequest; }
    }
    public CookieCollection Cookies
    {
    get { return cookieContainer.GetCookies(httpRequest.RequestUri); }
    }
    public NameValueCollection Form
    {
    get
    {
    if (form == null)
    {
    form
    = new NameValueCollection();
    }
    return form;
    }
    }
    public List<HttpFile> Files
    {
    get
    {
    if (files == null)
    {
    files
    = new List<HttpFile>();
    }
    return files;
    }
    }
    #endregion

    #region Constructor
    public HttpWalker(Uri uri)
    {
    this.RequestUri = uri;
    cookieContainer
    = new CookieContainer();
    referer
    = "http://www.google.com";
    }
    #endregion

    #region Methods
    public long GetContentLengthByHead()
    {
    return GetContentLengthByHead(true);
    }
    public long GetContentLengthByHead(bool reset)
    {
    using (HttpWebResponse httpResponse = GetResponse(WebRequestMethods.Http.Head))
    {
    if (reset)
    {
    httpRequest
    = (HttpWebRequest)WebRequest.Create(httpRequest.RequestUri);
    }
    return httpResponse.ContentLength;
    }
    }

    public HttpWebResponse GetResponse()
    {
    if ((form != null && form.Count > 0) || (files != null && files.Count > 0))
    {
    return GetResponse(WebRequestMethods.Http.Post);
    }
    else
    {
    return GetResponse(WebRequestMethods.Http.Get);
    }
    }
    public HttpWebResponse GetResponse(string method)
    {
    if (httpRequest.RequestUri.Scheme == "https")
    {
    ServicePointManager.ServerCertificateValidationCallback
    = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
    }
    httpRequest.CookieContainer
    = cookieContainer;
    httpRequest.Referer
    = referer;
    httpRequest.Accept
    = "*/*";
    httpRequest.UserAgent
    = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
    if ((httpRequest.Method = method) == WebRequestMethods.Http.Post)
    {
    StringBuilder sb
    = new StringBuilder();
    if (files.Count > 0)
    {
    Queue methodQueue
    = new Queue();
    string boundary = Guid.NewGuid().ToString().Replace("-", string.Empty), line = "\r\n";
    byte[] beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + line);
    //byte[] endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--" + newLine);
    httpRequest.ContentType = "multipart/form-data; boundary=" + boundary;
    long contentLength = 0L;
    if (form != null && form.Count > 0)
    {
    for (int i = 0; i < form.Count; i++)
    {
    sb.Length
    = 0;
    sb.AppendFormat(
    "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n", form.GetKey(i));
    sb.AppendFormat(
    "{0}\r\n", form.Get(i));
    byte[] header = Encoding.UTF8.GetBytes(sb.ToString());
    contentLength
    += beginBoundary.LongLength + header.LongLength;
    methodQueue.Enqueue(
    new Action<Stream>(stream =>
    {
    stream.Write(beginBoundary,
    0, beginBoundary.Length);
    stream.Write(header,
    0, header.Length);
    }));
    }
    }
    if (files != null)
    {
    sb.Length
    = 0;
    sb.Append(line);
    sb.Append(
    "--" + boundary + line);
    byte[] endOfFile = Encoding.ASCII.GetBytes(sb.ToString());
    files.ForEach(file
    =>
    {
    sb.Length
    = 0;
    sb.AppendFormat(
    "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n", file.FieldName, Path.GetFileName(file.FileName));
    sb.Append(
    "Content-Type: application/octet-stream\r\n\r\n");
    byte[] header = Encoding.UTF8.GetBytes(sb.ToString());
    contentLength
    += beginBoundary.LongLength + header.LongLength + file.ContentLength + endOfFile.LongLength;
    methodQueue.Enqueue(
    new Action<Stream>(stream =>
    {
    stream.Write(beginBoundary,
    0, beginBoundary.Length);
    stream.Write(header,
    0, header.Length);
    file.WriteTo(stream);
    stream.Write(endOfFile,
    0, endOfFile.Length);
    }));
    });
    }
    httpRequest.ContentLength
    = contentLength;
    Stream requestStream
    = httpRequest.GetRequestStream();
    while (methodQueue.Count > 0)
    {
    ((Action
    <Stream>)methodQueue.Dequeue())(requestStream);
    }
    requestStream.Close();
    }
    else
    {
    if (form != null && form.Count > 0)
    {
    httpRequest.ContentType
    = "application/x-www-form-urlencoded";
    sb.Append(form.GetKey(
    0)).Append("=").Append(form.Get(0));
    for (int i = 1; i < form.Count; i++)
    {
    sb.Append(
    "&").Append(form.GetKey(i)).Append("=").Append(form.Get(i));
    }
    byte[] data = Encoding.UTF8.GetBytes(sb.ToString());
    httpRequest.ContentLength
    = data.LongLength;
    Stream requestStream
    = httpRequest.GetRequestStream();
    requestStream.Write(data,
    0, data.Length);
    requestStream.Close();
    }
    }
    }
    HttpWebResponse httpResponse
    = (HttpWebResponse)httpRequest.GetResponse();
    referer
    = httpResponse.ResponseUri.AbsoluteUri;
    return httpResponse;
    }
    //https
    private bool CheckValidationResult(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors errors)
    {
    // Always accept
    return true;
    }

    public void Reset(Uri uri)
    {
    this.RequestUri = uri;
    cookieContainer
    = new CookieContainer();
    referer
    = "http://www.google.com";
    if (form != null)
    {
    form.Clear();
    }
    if (files != null)
    {
    files.Clear();
    }
    }
    public void RefreshCookies()
    {
    cookieContainer
    = new CookieContainer();
    }

    public override string ToString()
    {
    HttpWebResponse httpResponse
    = GetResponse();
    using (StreamReader reader = new StreamReader(httpResponse.GetResponseStream(), Encoding.GetEncoding(httpResponse.CharacterSet ?? "gb2312")))
    {
    return reader.ReadToEnd();
    }
    }
    #endregion

    #region File
    public void DownloadFile(string savePath)
    {
    using (FileStream stream = new FileStream(savePath, File.Exists(savePath) ? FileMode.Append : FileMode.CreateNew, FileAccess.Write, FileShare.None))
    {
    httpRequest.AddRange((
    int)stream.Length);
    HttpWebResponse response
    = GetResponse();
    byte[] buffer = new byte[BufferUtility.FileBufferSize];
    Stream responseStream
    = response.GetResponseStream();
    long p = stream.Length, l = response.ContentLength;
    int read;
    while (p < l && (read = responseStream.Read(buffer, 0, buffer.Length)) != 0)
    {
    stream.Write(buffer,
    0, read);
    stream.Flush();
    p
    += read;
    }
    responseStream.Close();
    }
    }

    public string UploadFile(string filePath)
    {
    string fileName = Path.GetFileName(filePath);
    string base64FileName = Convert.ToBase64String(Encoding.ASCII.GetBytes(fileName));
    httpRequest.Headers[
    "filename"] = base64FileName;
    httpRequest.Headers[
    "breakpoint"] = bool.TrueString;
    long p = GetContentLengthByHead(), l;
    string boundary = DateTime.Now.Ticks.ToString("x"), line = "\r\n";
    StringBuilder sb
    = new StringBuilder();
    sb.Append(
    "--").Append(boundary).Append(line);
    sb.Append(
    "Content-Disposition: form-data; name=\"file\"; ").Append("filename=\"").Append(fileName).Append("\"").Append(line);
    sb.Append(
    "Content-Type: application/octet-stream").Append(line);
    sb.Append(line);
    byte[] headerBytes = Encoding.UTF8.GetBytes(sb.ToString());
    sb.Length
    = 0;
    sb.Append(line);
    sb.Append(
    "--").Append(boundary).Append(line);
    byte[] endOfFile = Encoding.ASCII.GetBytes(sb.ToString());
    httpRequest.Method
    = WebRequestMethods.Http.Post;
    httpRequest.AllowWriteStreamBuffering
    = false;
    httpRequest.Timeout
    = 300000;
    httpRequest.ContentType
    = "multipart/form-data; boundary=" + boundary;
    using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    httpRequest.Headers[
    "filename"] = base64FileName;
    httpRequest.Headers[
    "breakpoint"] = stream.Length.ToString();
    stream.Position
    = p;
    l
    = stream.Length;
    httpRequest.ContentLength
    = headerBytes.Length + (l - p) + endOfFile.Length;
    byte[] buffer = BufferUtility.GetBuffer((int)stream.Length);
    Stream requestStream
    = httpRequest.GetRequestStream();
    requestStream.Write(headerBytes,
    0, headerBytes.Length);
    int read;
    while (p < l)
    {
    requestStream.Write(buffer,
    0, read = stream.Read(buffer, 0, buffer.Length));
    requestStream.Flush();
    p
    += read;
    }
    requestStream.Write(endOfFile,
    0, endOfFile.Length);
    requestStream.Close();
    }
    return ToString();
    }
    #endregion
    }

    #region HttpFile
    public sealed class HttpFile
    {
    private long offset, length;
    private byte[] binaryData;

    public string FieldName { set; get; }
    public string FileName { private set; get; }
    public long ContentLength
    {
    get { return binaryData == null ? length : binaryData.LongLength; }
    }

    public HttpFile(string fieldName, string fileName)
    {
    this.FieldName = fieldName;
    this.FileName = fileName;
    FileInfo info
    = new FileInfo(fileName);
    this.offset = 0L;
    this.length = info.Length;
    }
    public HttpFile(string fieldName, string fileName, long offset, long length)
    {
    this.FieldName = fieldName;
    this.FileName = fileName;
    this.offset = offset;
    this.length = length;
    }

    public HttpFile(string fieldName, string fileName, byte[] binaryData)
    {
    this.FieldName = fieldName;
    this.FileName = fileName;
    this.binaryData = binaryData;
    }

    public void WriteTo(Stream stream)
    {
    if (binaryData == null)
    {
    using (FileStream fileStream = new FileStream(FileName, FileMode.Open, FileAccess.Read))
    {
    byte[] buffer = BufferUtility.GetBuffer((int)fileStream.Length);
    fileStream.Position
    = offset;
    long done = 0L;
    int read;
    while (done < length)
    {
    stream.Write(buffer,
    0, read = fileStream.Read(buffer, 0, buffer.Length));
    stream.Flush();
    done
    += read;
    }
    }
    }
    else
    {
    stream.Write(binaryData,
    0, binaryData.Length);
    stream.Flush();
    }
    }
    }
    #endregion
    }
    上传Demo
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Rocky.Net;
    using System.IO;

    public partial class _Default : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    //FileStream stream1 = new FileStream(@"F:\ToolsDev\fireworks8.zip", FileMode.Open);
    //FileStream stream2 = new FileStream(@"d:\IE8.zip", FileMode.Create);
    //long length = 1024L * 1024L * 8L;
    //byte[] buffer = new byte[1024 * 4];
    //int read;
    //while (length > 0 && (read = stream1.Read(buffer, 0, buffer.Length)) != 0)
    //{
    // stream2.Write(buffer, 0, read);
    // stream2.Flush();
    // length -= read;
    //}
    //stream1.Close();
    //stream2.Close();
    //Response.End();
    if (Request.QueryString["action"] == "server")
    {
    HttpWalker.UploadFile(
    this.Context, Server.MapPath("~/IE8.zip"));
    }
    else
    {
    try
    {
    HttpWalker w
    = new HttpWalker(new Uri("http://rocky.net?action=server"));
    Response.Write(w.UploadFile(
    @"D:\fireworks8.zip"));
    }
    catch (Exception ex)
    {
    Response.Write(ex);
    }
    }
    Response.End();
    }

    protected void Button1_Click(object sender, EventArgs e)
    {

    }
    }
  • 相关阅读:
    关于UITapGestureRecognizer的一些问题
    自定义导航栏返回按钮
    mousewheel滚轮事件 浏览器的写法
    Apache日志不记录图片文件设置方法和来源日志的配置
    redis持久化配置
    haproxy实现负载均衡
    Keepalived高可用软件的安装与配置
    Sublime text2用户自定义配置
    判断各版本的最简写法
    Ubuntu防火墙 UFW 设置
  • 原文地址:https://www.cnblogs.com/westfruit/p/1813540.html
Copyright © 2011-2022 走看看