title: Upload files from client to server programmatically
body: <p>I'm working on fileupload control with a simple application which transfer file to server automatically.</p>
  
  <p>I used as references those samples <a href="http://www.codeproject.com/KB/aspnet/set-webbrowser-file-input.aspx" rel="nofollow">Setting a file to upload inside the WebBrowser component</a> and <a href="http://www.codeproject.com/KB/cs/uploadfileex.aspx?fid=119603&amp;select=971677&amp;fr=36#xx0xx" rel="nofollow">UploadFileEx</a> but when tested doesn't create a file on the server!</p>
  
  <p>Form Code:</p>
  
  <pre><code>// simulate this form 
          //&lt;form action ="http://localhost/test.php" method = POST&gt;
          //&lt;input type = text name = uname&gt;
          //&lt;input type = password name =passwd&gt;
          //&lt;input type = FILE name = uploadfile&gt;
          //&lt;input type=submit&gt;
  </code></pre>
  
  <p>I found this class which post file to server using HttpWebRequest:</p>
  
  <pre><code>    public static string UploadFileEx(  string uploadfile, string url,
          string fileFormName, string contenttype,NameValueCollection querystring,
          CookieContainer cookies)
      {
          if( (fileFormName== null) ||
              (fileFormName.Length ==0))
          {
              fileFormName = "file";
          }
  
          if( (contenttype== null) ||
              (contenttype.Length ==0))
          {
              contenttype = "application/octet-stream";
          }
  
  
          string postdata;
          postdata = "?";
          if (querystring!=null)
          {
              foreach(string key in querystring.Keys)
              {
                  postdata+= key +"=" + querystring.Get(key)+"&amp;";
              }
          }
          Uri uri = new Uri(url+postdata);
  
  
          string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
          HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
          webrequest.CookieContainer = cookies;
          webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
          webrequest.Method = "POST";
  
  
          // Build up the post message header
          StringBuilder sb = new StringBuilder();
          sb.Append("--");
          sb.Append(boundary);
          sb.Append("\r\n");
          sb.Append("Content-Disposition: form-data; name=\"");
          sb.Append(fileFormName);
          sb.Append("\"; filename=\"");
          sb.Append(Path.GetFileName(uploadfile));
          sb.Append("\"");
          sb.Append("\r\n");
          sb.Append("Content-Type: ");
          sb.Append(contenttype);
          sb.Append("\r\n");
          sb.Append("\r\n");          
  
          string postHeader = sb.ToString();
          byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);
  
          // Build the trailing boundary string as a byte array
          // ensuring the boundary appears on a line by itself
          byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
  
          FileStream fileStream = new FileStream(uploadfile, FileMode.Open, FileAccess.Read);
          long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
          webrequest.ContentLength = length;
  
          Stream requestStream = webrequest.GetRequestStream();
  
          // Write out our post header
          requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
  
          // Write out the file contents
          byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
          int bytesRead = 0;
          while ( (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 )
              requestStream.Write(buffer, 0, bytesRead);
  
          // Write out the trailing boundary
          requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
          requestStream.Flush();
          requestStream.Close();
          WebResponse responce = webrequest.GetResponse();
          Stream s = responce.GetResponseStream();
          StreamReader sr = new StreamReader(s);
  
          return sr.ReadToEnd();
  
      }
      /// &lt;summary&gt;
      /// The main entry point for the application.
      /// &lt;/summary&gt;
      [STAThread]
      static void Main(string[] args)
      {
          CookieContainer cookies = new CookieContainer();
          //add or use cookies
  
          NameValueCollection querystring = new NameValueCollection();
  
          querystring["uname"]="";
          querystring["passwd"]="";
  
          string uploadfile;// set to file to upload
  
          uploadfile = "C:\\test.jpg";
  
          UploadFileEx(uploadfile, "http://127.0.0.1/app/Default.aspx", "uploadfile", "image/pjpeg",
                          querystring, cookies);
  
  
  
      }
  </code></pre>
  
  <p>in my case I want to use this class via WebBrowser control but when I send post to server the file(test.jpg) not created!</p>
  
  <p>It could be a problem of permission on the folder! but when tested localy using IIS I get the same problem?</p>
  
  <p>Thanks</p>