日期:2014-05-17 浏览次数:20627 次
using System; using System.Collections.Generic; using System.Text; using System.Collections.Specialized; using System.Net; using System.Net.Sockets; using System.IO; namespace CompleteClient { /// <summary> /// 文件发送工作类 /// </summary> class PostFile { /// <summary> /// 通过post发送指定文件的指定字段到指定的uri上 /// </summary> /// <param name="uploadfile">上传文件路径</param> /// <param name="url">上传的到的URi位置</param> /// <param name="offset">当前偏移量</param> /// <param name="size">需要发送的块大小</param> /// <param name="fileFormName">服务器端"GET"取得的文件名</param> /// <param name="contenttype">文件类型(保留用)</param> /// <param name="querystring">GET数组(供服务器用GET取得一些信息)</param> /// <param name="cookies">本地cookies(保留用)</param> /// <returns>uri的response的内容以string的形式返回</returns> public string UploadFileEx(string uploadfile, string url, long offset, long size, 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) + "&"; } } 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"; // 构造一个post请求的http头 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 + (long)size + boundaryByte