2013-08-30 23 views
10

私はこのコードを使用して、ウェブページにパラメータを送信し、それから正しい応答を得ています。投稿リクエストでファイル+パラメータを送信

 System.Net.WebClient oWeb = new System.Net.WebClient(); 
     oWeb.Proxy = System.Net.WebRequest.DefaultWebProxy; 
     oWeb.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     oWeb.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 
     byte[] bytArguments = System.Text.Encoding.ASCII.GetBytes("value1=123&value2=xyz"); 
     byte[] bytRetData = oWeb.UploadData("http://website.com/file.php", "POST", bytArguments); 
     response = System.Text.Encoding.ASCII.GetString(bytRetData); 

しかし、今、私はそれに(.doc)のようにファイルを送信したいパラメータ(value1value2)の上に+が、私はそれを行う方法がわかりません。

答えて

10

WebClient.QueryStringを使用して、要求に関連付けられた名前と値のペアを渡します。

NameValueCollection parameters = new NameValueCollection(); 
parameters.Add("value1", "123"); 
parameters.Add("value2", "xyz"); 
oWeb.QueryString = parameters; 
var responseBytes = oWeb.UploadFile("http://website.com/file.php", "path to file"); 
string response = Encoding.ASCII.GetString(responseBytes); 
+0

私は.docファイルを投稿したいですが、 'WebClient.QueryString'で可能ですか? –

+0

簡単な方法は、コードスニペットを試してみることです。 –

+0

これらのパラメータで実際のファイル(.doc)を送信する方法を教えてください。そして、私は 'params'は予約語だと思います。 –

6
public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc) 
    { 
     string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); 
     byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); 

     HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url); 
     wr.ContentType = "multipart/form-data; boundary=" + boundary; 
     wr.Method = "POST"; 
     wr.KeepAlive = true; 
     wr.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     Stream rs = wr.GetRequestStream(); 
     string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; 
     foreach (string key in nvc.Keys) 
     { 
      rs.Write(boundarybytes, 0, boundarybytes.Length); 
      string formitem = string.Format(formdataTemplate, key, nvc[key]); 
      byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); 
      rs.Write(formitembytes, 0, formitembytes.Length); 
     } 
     rs.Write(boundarybytes, 0, boundarybytes.Length); 
     string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; 
     string header = string.Format(headerTemplate, paramName, file, contentType); 
     byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); 
     rs.Write(headerbytes, 0, headerbytes.Length); 
     FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read); 
     byte[] buffer = new byte[4096]; 
     int bytesRead = 0; 
     while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      rs.Write(buffer, 0, bytesRead); 
     } 
     fileStream.Close(); 
     byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); 
     rs.Write(trailer, 0, trailer.Length); 
     rs.Close(); 
     WebResponse wresp = null; 
     try 
     { 
      wresp = wr.GetResponse(); 
      Stream stream2 = wresp.GetResponseStream(); 
      StreamReader reader2 = new StreamReader(stream2); 
      result = reader2.ReadToEnd(); 
     } 
     catch (Exception ex) 
     { 
      System.Windows.MessageBox.Show("Error occurred while converting file", "Error!"); 
      if (wresp != null) 
      { 
       wresp.Close(); 
       wresp = null; 
      } 
     } 
     finally 
     { 
      wr = null; 
     } 
    } 

SOからコピーされたが、それは、リンクだ覚えていないことができます。そして、これはそれが

 NameValueCollection nvc = new NameValueCollection(); 
     nvc.Add("parm1", "value1"); 
     nvc.Add("parm2", "value2"); 
     nvc.Add("parm3", "value3"); 
     HttpUploadFile("http://www.example.com/upload.php",@filepath, "file", "text/html", nvc); 

ここ@filepathを使用する方法であることは、あなたがアップロードしたいファイルのパスです。C:\ file_to_upload.doc とfileは、提出された$ _Filesとして、PHPで使用されるの名前です[ 'file']

+1

リンクはおそらくhttp://stackoverflow.com/q/12279356/959339 –

+0

だから、成功しなかった承認された答えで( 'WebClient.QueryString'を使用して)? – Prokurors

+0

はい、うまくいきました。 –

関連する問題