[转]C#在WinForm下使用HttpWebRequest上传文件并显示进度

时间:2021-10-04 07:24:36

/// <summary> 
/// 将本地文件上传到指定的处事器(HttpWebRequest要领) 
/// </summary> 
/// <param>文件上传到的处事器</param> 
/// <param>要上传的本地文件(全路径)</param> 
/// <param>文件上传后的名称</param> 
/// <param>上传进度条</param> 
/// <returns>告成返回1,掉败返回0</returns> 
private int Upload_Request(string address, string fileNamePath, string saveName, ProgressBar progressBar) 

    int returnValue = 0;

 

    // 要上传的文件 
    FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read); 
    BinaryReader r = new BinaryReader(fs);

 

    //时间戳 
    string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x"); 
    byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");

 

    //请求头部信息 
    StringBuilder sb = new StringBuilder(); 
    sb.Append("--"); 
    sb.Append(strBoundary); 
    sb.Append("\r\n"); 
    sb.Append("Content-Disposition: form-data; name=\""); 
    sb.Append("file"); 
    sb.Append("\"; filename=\""); 
    sb.Append(saveName); 
    sb.Append("\""); 
    sb.Append("\r\n"); 
    sb.Append("Content-Type: "); 
    sb.Append("application/octet-stream"); 
    sb.Append("\r\n"); 
    sb.Append("\r\n"); 
    string strPostHeader = sb.ToString(); 
    byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);

 

    // 按照uri创建HttpWebRequest东西 
    HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address)); 
    httpReq.Method = "POST";

 

    //对发送的数据不使用缓存 
    httpReq.AllowWriteStreamBuffering = false;

 

    //设置获得响应的超不时间(300秒) 
    httpReq.Timeout = 300000; 
    httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary; 
    long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length; 
    long fileLength = fs.Length; 
    httpReq.ContentLength = length; 
    try 
    { 
        progressBar.Maximum = int.MaxValue; 
        progressBar.Minimum = 0; 
        progressBar.Value = 0;

 

        //每次上传4k 
        int bufferLength = 4096; 
        byte[] buffer = new byte[bufferLength];

 

        //已上传的字节数 
        long offset = 0;

 

        //开始上传时间 
        DateTime startTime = DateTime.Now; 
        int size = r.Read(buffer, 0, bufferLength); 
        Stream postStream = httpReq.GetRequestStream();