• 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)
    {

    }
    }

  • 相关阅读:
    欧拉回路 定理
    UESTC 1087 【二分查找】
    POJ 3159 【朴素的差分约束】
    ZOJ 1232 【灵活运用FLOYD】 【图DP】
    POJ 3013 【需要一点点思维...】【乘法分配率】
    POJ 2502 【思维是朴素的最短路 卡输入和建图】
    POJ 2240 【这题貌似可以直接FLOYD 屌丝用SPFA通过枚举找正权值环 顺便学了下map】
    POJ 1860【求解是否存在权值为正的环 屌丝做的第一道权值需要计算的题 想喊一声SPFA万岁】
    POJ 1797 【一种叫做最大生成树的很有趣的贪心】【也可以用dij的变形思想~】
    js 实现slider封装
  • 原文地址:https://www.cnblogs.com/Googler/p/1807021.html
Copyright © 2020-2023  润新知