转载自:http://www.codeproject.com/KB/cs/uploadfileex.aspx

前言:

这篇文章翻译来自madmik3 写在 CodeProject 上的文章,原标题为: C#'s WebClient.UploadFile with more functionality.

正文:

我们使用 WebRequest 来获取网页内容是非常简单的,可是用他来上传文件就没有那么简单了。

如果我们在网页中上传文件,加入下面代码即可:

HTML 文件上传代码实例
  1. <form action ="http://localhost/test.php" method = POST>  
  2.   <input type = text name = uname>  
  3.   <input type = password name =passwd>  
  4.   <input type = FILE name = uploadfile>  
  5.   <input type=submit>  
  6. </form>  

但,如果在C#中使用 WebRequest 上传,必须对本地文件进行相应的处理才能提交到指定的HTTP地址,下面这个函数哦就帮我们做了这烦恼的操作

UploadFileEx 上传文件函数
  1. public static string UploadFileEx( string uploadfile, string url,    
  2.     string fileFormName, string contenttype,NameValueCollection querystring,    
  3.     CookieContainer cookies)   
  4. {   
  5.     if( (fileFormName== null) ||   
  6.         (fileFormName.Length ==0))   
  7.     {   
  8.         fileFormName = "file";   
  9.     }   
  10.   
  11.     if( (contenttype== null) ||   
  12.         (contenttype.Length ==0))   
  13.     {   
  14.         contenttype = "application/octet-stream";   
  15.     }   
  16.   
  17.   
  18.     string postdata;   
  19.     postdata = "?";   
  20.     if (querystring!=null)   
  21.     {   
  22.         foreach(string key in querystring.Keys)   
  23.         {   
  24.             postdata+= key +"=" + querystring.Get(key)+"&";   
  25.         }   
  26.     }   
  27.     Uri uri = new Uri(url+postdata);   
  28.   
  29.   
  30.     string boundary = "----------" + DateTime.Now.Ticks.ToString("x");   
  31.     HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);   
  32.     webrequest.CookieContainer = cookies;   
  33.     webrequest.ContentType = "multipart/form-data; boundary=" + boundary;   
  34.     webrequest.Method = "POST";   
  35.   
  36.   
  37.     // Build up the post message header   
  38.     StringBuilder sb = new StringBuilder();   
  39.     sb.Append("--");   
  40.     sb.Append(boundary);   
  41.     sb.Append("");   
  42.     sb.Append("Content-Disposition: form-data; name=\"");   
  43.     sb.Append(fileFormName);   
  44.     sb.Append("\"; filename=\"");   
  45.     sb.Append(Path.GetFileName(uploadfile));   
  46.     sb.Append("\"");   
  47.     sb.Append("");   
  48.     sb.Append("Content-Type: ");   
  49.     sb.Append(contenttype);   
  50.     sb.Append("");   
  51.     sb.Append("");               
  52.   
  53.     string postHeader = sb.ToString();   
  54.     byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);   
  55.   
  56.     // Build the trailing boundary string as a byte array   
  57.     // ensuring the boundary appears on a line by itself   
  58.     byte[] boundaryBytes =    
  59.            Encoding.ASCII.GetBytes("--" + boundary + "");   
  60.   
  61.     FileStream fileStream = new FileStream(uploadfile,    
  62.                                 FileMode.Open, FileAccess.Read);   
  63.     long length = postHeaderBytes.Length + fileStream.Length +    
  64.                                            boundaryBytes.Length;   
  65.     webrequest.ContentLength = length;   
  66.   
  67.     Stream requestStream = webrequest.GetRequestStream();   
  68.   
  69.     // Write out our post header   
  70.     requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);   
  71.   
  72.     // Write out the file contents   
  73.     byte[] buffer = new Byte[checked((uint)Math.Min(4096,    
  74.                              (int)fileStream.Length))];   
  75.     int bytesRead = 0;   
  76.     while ( (bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0 )   
  77.         requestStream.Write(buffer, 0, bytesRead);   
  78.   
  79.     // Write out the trailing boundary   
  80.     requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);   
  81.     WebResponse responce = webrequest.GetResponse();   
  82.     Stream s = responce.GetResponseStream();   
  83.     StreamReader sr = new StreamReader(s);   
  84.   
  85.     return sr.ReadToEnd();   
  86. }  

调用代码如下:

调用代码
  1. CookieContainer cookies = new CookieContainer();   
  2. //add or use cookies   
  3. NameValueCollection querystring = new NameValueCollection();   
  4. querystring["uname"]="uname";   
  5. querystring["passwd"]="snake3";   
  6. string uploadfile;// set to file to upload   
  7. uploadfile = "c:\\test.jpg";   
  8.   
  9. //everything except upload file and url can be left blank if needed   
  10. string outdata = UploadFileEx(uploadfile,    
  11.      "http://localhost/test.php","uploadfile""image/pjpeg",    
  12.      querystring,cookies);  

至此,所有代码都已经奉献完毕,接下来就看你怎么去美化你的程序了。

作者还提供了接收文件的PHP代码,,我觉得既然能写上传的程序,接收文件的Server Page应该不在话下的,况且又不是PHP才能接收提交的文件,ASP,ASP.NET,JSP都可以,所以就不贴了。