通過使用c# system.net庫中的HttpRequest來發送一個檔案指定的一個欄位到指定的web伺服器,並且類比了get部分,cookies等</p><p>using System;<br />using System.Collections.Generic;<br />using System.Text;<br />using System.Collections.Specialized;<br />using System.Net;<br />using System.Net.Sockets;<br />using System.IO;<br />namespace CompleteClient<br />{<br /> /// <summary><br /> /// 檔案發送工作類<br /> /// </summary><br /> class PostFile<br /> {<br /> /// <summary><br /> /// 通過post發送指定檔案的指定欄位到指定的uri上<br /> /// </summary><br /> /// <param name="uploadfile">上傳檔案路徑</param><br /> /// <param name="url">上傳的到的URi位置</param><br /> /// <param name="offset">當前位移量</param><br /> /// <param name="size">需要發送的塊大小</param><br /> /// <param name="fileFormName">伺服器端"GET"取得的檔案名稱</param><br /> /// <param name="contenttype">檔案類型(保留用)</param><br /> /// <param name="querystring">GET數組(供伺服器用GET取得一些資訊)</param><br /> /// <param name="cookies">本地cookies(保留用)</param><br /> /// <returns>uri的response的內容以string的形式返回</returns><br /> public string UploadFileEx(string uploadfile, string url, long offset, long size,<br /> string fileFormName, string contenttype,<br /> NameValueCollection querystring, CookieContainer cookies)<br /> {<br /> if ((fileFormName == null) ||<br /> (fileFormName.Length == 0))<br /> {<br /> fileFormName = "file";<br /> }</p><p> if ((contenttype == null) ||<br /> (contenttype.Length == 0))<br /> {<br /> contenttype = "application/octet-stream";<br /> }</p><p> string postdata;<br /> postdata = "?";<br /> if (querystring != null)<br /> {<br /> foreach (string key in querystring.Keys)<br /> {<br /> postdata += key + "=" + querystring.Get(key) + "&";<br /> }<br /> }<br /> Uri uri = new Uri(url + postdata);</p><p> string boundary = "----------" + DateTime.Now.Ticks.ToString("x");<br /> HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);<br /> webrequest.CookieContainer = cookies;<br /> webrequest.ContentType = "multipart/form-data; boundary=" + boundary;<br /> webrequest.Method = "POST";</p><p> // 構造一個post請求的http頭<br /> StringBuilder sb = new StringBuilder();<br /> sb.Append("--");<br /> sb.Append(boundary);<br /> sb.Append("/r/n");<br /> sb.Append("Content-Disposition: form-data; name=/"");<br /> sb.Append(fileFormName);<br /> sb.Append("/"; filename=/"");<br /> sb.Append(Path.GetFileName(uploadfile));<br /> sb.Append("/"");<br /> sb.Append("/r/n");<br /> sb.Append("Content-Type: ");<br /> sb.Append(contenttype);<br /> sb.Append("/r/n");<br /> sb.Append("/r/n");</p><p> string postHeader = sb.ToString();<br /> byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);</p><p> // Build the trailing boundary string as a byte array<br /> // ensuring the boundary appears on a line by itself<br /> byte[] boundaryBytes =<br /> Encoding.ASCII.GetBytes("/r/n--" + boundary + "/r/n");</p><p> FileStream fileStream = new FileStream(uploadfile,<br /> FileMode.Open, FileAccess.Read);<br /> long length = postHeaderBytes.Length + (long)size +<br /> boundaryBytes.Length;<br /> webrequest.ContentLength = length;</p><p> Stream requestStream = webrequest.GetRequestStream();<br /> // 寫入post頭<br /> requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);</p><p> // 寫入檔案內容<br /> byte[] buffer = new Byte[size];<br /> fileStream.Seek(offset, SeekOrigin.Current);<br /> fileStream.Read(buffer, 0, buffer.Length);</p><p> requestStream.Write(buffer, 0, buffer.Length);</p><p> // 寫入post請求的尾<br /> requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);<br /> //讀取伺服器的反饋訊息<br /> WebResponse responce = webrequest.GetResponse();<br /> Stream s = responce.GetResponseStream();<br /> StreamReader sr = new StreamReader(s);</p><p> return sr.ReadToEnd();<br /> }<br /> }<br />}<br />