2016-07-08 1 views
0

私はHttpWebRequestを使用してサーバーにファイルをアップロードしています。リクエストは2つのファイルをサーバー、ビデオファイル、イメージファイルに送信します。進行状況全体の進行状況を追跡しようとしていますが、問題は進行状況ログがファイルのアップロードごとに個別に実行されることです。進捗状況は両方のアップロードで一度しか表示されないようにしたいが、それをどうやって行うのか分かりません。マルチパート/ボディのウェブリクエストを使用して複数のファイルアップロードの進行状況をトラッキングする

Dictionary<string, string> fields = new Dictionary<string, string>(); 
     fields.Add("username", username); 

     HttpWebRequest hr = WebRequest.Create(url) as HttpWebRequest; 
     hr.Timeout = 500000; 
     string bound = "----------------------------" + DateTime.Now.Ticks.ToString("x"); 
     hr.ContentType = "multipart/form-data; boundary=" + bound; 
     hr.Method = "POST"; 
     hr.KeepAlive = true; 
     hr.Credentials = CredentialCache.DefaultCredentials; 

     byte[] boundBytes = Encoding.ASCII.GetBytes("\r\n--" + bound + "\r\n"); 
     string formDataTemplate = "\r\n--" + bound + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}"; 

     Stream s = hr.GetRequestStreamWithTimeout(1000000); 

     foreach (string key in fields.Keys) 
     { 
      byte[] formItemBytes = Encoding.UTF8.GetBytes(
       string.Format(formDataTemplate, key, fields[key])); 
      s.Write(formItemBytes, 0, formItemBytes.Length); 
     } 

     s.Write(boundBytes, 0, boundBytes.Length); 

     string headerTemplate = 
      "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n"; 

     List<string> files = new List<string> { fileUrl, thumbUrl }; 
     List<string> type = new List<string> { "video", "thumb" }; 

     int count = 0; 
     foreach (string f in files) 
     { 
      var m = Path.GetFileName(f); 
      var t = type[count]; 
      var j = string.Format(headerTemplate, t, m); 
      byte[] headerBytes = Encoding.UTF8.GetBytes(
       string.Format(headerTemplate, type[count], Path.GetFileName(f))); 

      s.Write(headerBytes, 0, headerBytes.Length); 
      FileStream fs = new FileStream(f, FileMode.Open, FileAccess.Read); 
      int bytesRead = 0; 
      long bytesSoFar = 0; 
      byte[] buffer = new byte[1024]; 
      while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0) 
      { 
       bytesSoFar += bytesRead; 
       s.Write(buffer, 0, buffer.Length); 
       Console.WriteLine(string.Format("sending file data {0:0.000}%", (bytesSoFar * 100.0f)/fs.Length)); 

      } 

      s.Write(boundBytes, 0, boundBytes.Length); 
      fs.Close(); 

      count += 1; 
     } 

     s.Close(); 

     string respString = ""; 
     hr.BeginGetResponse((IAsyncResult res) => 
     { 
      WebResponse resp = ((HttpWebRequest)res.AsyncState).EndGetResponse(res); 

      StreamReader respReader = new StreamReader(resp.GetResponseStream()); 
      respString = respReader.ReadToEnd(); 
      resp.Close(); 
      resp = null; 
     }, hr); 

     while (!hr.HaveResponse) 
     { 
      Console.Write("hiya bob!"); 
      Thread.Sleep(150); 
     } 

     Console.Write(respString); 
     hr = null; 

両方のアップロードの進捗ログを1つのログに結合するにはどうすればよいですか?どんな助けもありがとうございます。

// Calculate the total size to upload before starting work 
long totalToUpload = 0; 
foreach (var f in files) 
{ 
    totalToUpload += (new FileInfo(f)).Length; 
} 

が次にどんなファイルで送信されたバイトの合計数を追跡し、あなたの計算にそれを使用:

答えて

1

1つのオプションは、あなたがどんな仕事をして前に送信する必要が総バイト数を計算することです進捗状況:

int count = 0; 
long bytesSoFar = 0; 

foreach (string f in files) 
{ 
    // ... Your existing work ... 

    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0) 
    { 
     bytesSoFar += bytesRead; 
     // Make sure to only write the number of bytes read from the file 
     s.Write(buffer, 0, bytesRead); 
     // Console.WriteLine takes a string.Format() style string 
     Console.WriteLine("sending file data {0:0.000}%", (bytesSoFar * 100.0f)/totalToUpload); 
    } 
+0

クールこれはうまくいくかもしれない。私はあなたの答えを評価し、私がそれを働かせるなら答えた印をつけるために戻ってきます。ありがとう! :) –

+0

bytesSoFarに前回のファイルアップロードのバイト数を含めないでください。進捗バーは、最初のファイルアップロードでは0から96%になり、0で開始し、2回目のアップロードでは3.426%までになります。 –

+0

私はループの範囲外でbytesSoFarを定義する必要があると思います –

関連する問題