2012-02-10 2 views
0

Вот мой код:Загрузить файл с HttpWebRequest

private void UploadFilesToRemoteUrl(string url, string[] files, string logpath, NameValueCollection nvc) 
     { 
      long length = 0; 
      string boundary = "----------------------------" + 
      DateTime.Now.Ticks.ToString("x"); 

      HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url); 
      httpWebRequest2.ContentType = "multipart/form-data; boundary=" + boundary; 
      httpWebRequest2.Method = "POST"; 
      httpWebRequest2.KeepAlive = true; 
      httpWebRequest2.Credentials = System.Net.CredentialCache.DefaultCredentials; 

      Stream memStream = new System.IO.MemoryStream(); 

      byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); 


      string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}"; 

      foreach(string key in nvc.Keys) 
      { 
       string formitem = string.Format(formdataTemplate, key, nvc[key]); 
       byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); 
       memStream.Write(formitembytes, 0, formitembytes.Length); 
      } 


      memStream.Write(boundarybytes,0,boundarybytes.Length); 

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

      for(int i=0;i<files.Length;i++) 
      { 

       string header = string.Format(headerTemplate,"file"+i,files[i]); 

       byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); 

       memStream.Write(headerbytes,0,headerbytes.Length); 

       FileStream fileStream = new FileStream(files[i], FileMode.Open, 
       FileAccess.Read); 
       byte[] buffer = new byte[1024]; 

       int bytesRead = 0; 

       while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) 
       { 
        memStream.Write(buffer, 0, bytesRead); 
       } 

       memStream.Write(boundarybytes,0,boundarybytes.Length); 
       fileStream.Close(); 
      } 

      httpWebRequest2.ContentLength = memStream.Length; 

      Stream requestStream = httpWebRequest2.GetRequestStream(); 

      memStream.Position = 0; 
      byte[] tempBuffer = new byte[memStream.Length]; 
      memStream.Read(tempBuffer,0,tempBuffer.Length); 
      memStream.Close(); 
      requestStream.Write(tempBuffer,0,tempBuffer.Length); 
      requestStream.Close(); 


      WebResponse webResponse2 = httpWebRequest2.GetResponse(); 
      Stream stream2 = webResponse2.GetResponseStream(); 
      StreamReader reader2 = new StreamReader(stream2); 

      MessageBox.Show(reader2.ReadToEnd()); 

      webResponse2.Close(); 
      httpWebRequest2 = null; 
      webResponse2 = null; 

     } 

А вот как я это называю:

string[] filenames = new string[] { @"C:\Users\John\Desktop\ex.txt" }; 
NameValueCollection nvc = new NameValueCollection(); 
nvc.Add("cmd", "new"); 
nvc.Add("sTitle", "bugX"); 
nvc.Add("token", "someToken"); 
UploadFilesToRemoteUrl("https://myUrl.fogbugz.com/api.asp", filenames, "", nvc); 

И все работает нормально, за исключением того, что файл не загружен.

Я также попробовал этот код:

http://stackoverflow.com/questions/566462/upload-files-with-httpwebrequest-multipart-form-data 

и то же самое происходит. Как это решить?

Вот ответ от сервера:

<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
<response> 
    <case ixBug=\"123486\" operations=\"edit,assign,resolve,email,remind\"></case> 
</response> 

ответ

0

вы просто посылая поток на сервер, это невозможно знать, что происходит на сервере для нас, если вы не обеспечивают код нас со стороны сервера. Я думаю, вы забыли получить и создать файл на стороне сервера.

Если это не проблема, я предлагаю вам получить бесценный инструмент скрипача и начать ловить ваши http-запросы и посмотреть, что они содержат.

+0

Я отредактировал вопрос. Я добавил ответ сервера. –

+0

Вы написали код на стороне сервера? Или вы работаете против API? –

+0

Я использую Bugzilla api –

Смежные вопросы