winform下使用HttpWebRequest上传文件显示进度条

转:https://blog.csdn.net/huanghunjiuba/article/details/71627967

 

private static string Upload_Request(string address, string fileNamePath, string saveName, ProgressBar progressBar, Label lblTime, Label lblSpeed, Label lblState, Label lblSize)
        {
            string sReturnString = string.Empty;
            // 要上传的文件 
            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;
            //设置获得响应的超时时间(60秒)
            httpReq.Timeout = 60 * 1000;
            httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
            long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
            long fileLength = fs.Length;
            httpReq.ContentLength = length;
            httpReq.Headers.Add(HttpRequestHeader.Cookie, Cookie);
            //开始上传时间 
            DateTime startTime = DateTime.Now;
            DateTime endTime = DateTime.MinValue;
            try
            {
                //progressBar.Maximum = int.MaxValue;
                progressBar.Maximum = int.MaxValue;
                progressBar.Minimum = 0;
                progressBar.Value = 0;
                //每次上传4k
                int bufferLength = 4096;
                byte[] buffer = new byte[bufferLength];
                //已上传的字节数 
                long offset = 0;
                int size = r.Read(buffer, 0, bufferLength);
                Stream postStream = httpReq.GetRequestStream();
                //发送请求头部消息 
                postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                while (size > 0)
                {
                    if (!isUploadStop)
                    {
                        FileStatus = FileUploadStatus.Uploading;
                        postStream.Write(buffer, 0, size);
                        offset += size;
                        progressBar.Value = (int)(offset * (int.MaxValue / length));
                        TimeSpan span = DateTime.Now - startTime;
                        double second = span.TotalSeconds;
                        lblTime.Text = "已用时:" + second.ToString("F2") + "";
                        if (second > 0.001)
                        {
                            lblSpeed.Text = "平均速度:" + (offset / 1024 / second).ToString("0.00") + "KB/秒";
                        }
                        else
                        {
                            lblSpeed.Text = "正在连接…";
                        }
                        lblState.Text = "已上传:" + (offset * 100.0 / length).ToString("F2") + "%";
                        lblSize.Text = (offset / 1048576.0).ToString("F2") + "M/" + (fileLength / 1048576.0).ToString("F2") + "M";
                        Application.DoEvents();
                        size = r.Read(buffer, 0, bufferLength);
                    }
                    else
                    {
                        FileStatus = FileUploadStatus.Stopped;
                        httpReq.Abort();
                        isUploadStop = false;
                        break;
                    }
                }
                if (FileStatus != FileUploadStatus.Stopped)
                {
                    //添加尾部的时间戳 
                    postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                    postStream.Close();
                    //获取服务器端的响应 
                    WebResponse webRespon = httpReq.GetResponse();
                    Stream s = webRespon.GetResponseStream();
                    //读取服务器端返回的消息
                    StreamReader sr = new StreamReader(s);
                    sReturnString = sr.ReadLine();
                    s.Close();
                    sr.Close();
                }
                endTime = DateTime.Now;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                sReturnString = string.Empty;
                FileStatus = FileUploadStatus.Fault;
            }
            finally
            {

                fs.Close();
                r.Close();
            }
            progressBar.Value = int.MaxValue;
 
            lblState.Text = "已上传:100%";
             lblTime.Text = "已用时:" + (endTime - startTime).TotalSeconds.ToString("F2") + "";
            lblSize.Text = (fileLength / 1048576.0).ToString("F2") + "M/" + (fileLength / 1048576.0).ToString("F2") + "M";
            FileStatus = FileUploadStatus.Succeed;
            return sReturnString;
        }

 

posted @ 2018-09-28 17:12  wjl910  阅读(1009)  评论(0)    收藏  举报