using System.Net; using System.Text; namespace Hotline.DataSharing.Province { /// /// Post提交(包含文件提交) /// public class CFormUpload { private static readonly Encoding encoding = Encoding.UTF8; /// /// /// /// /// /// /// /// public static string MultipartFormDataPost(string postUrl, string userAgent, Dictionary postParameters, string authorization = "") { string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid()); string contentType = "multipart/form-data; boundary=" + formDataBoundary; byte[] formData = GetMultipartFormData(postParameters, formDataBoundary); HttpWebResponse webResponse = PostForm(postUrl, userAgent, contentType, formData, authorization); StreamReader responseReader = new StreamReader(webResponse.GetResponseStream()); string fullResponse = responseReader.ReadToEnd(); webResponse.Close(); return fullResponse; } /// private static HttpWebResponse PostForm(string postUrl, string userAgent, string contentType, byte[] formData, string authorization = "") { HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest; if (request == null) { throw new NullReferenceException("request is not a http request"); } // Set up the request properties. if (false == string.IsNullOrEmpty(authorization)) { request.Headers.Add("Authorization", "Bearer " + authorization); } request.Method = "POST"; request.ContentType = contentType; request.UserAgent = userAgent; request.CookieContainer = new CookieContainer(); request.ContentLength = formData.Length; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(formData, 0, formData.Length); requestStream.Close(); } var result = request.GetResponse() as HttpWebResponse; return result; } private static byte[] GetMultipartFormData(Dictionary postParameters, string boundary) { Stream formDataStream = new System.IO.MemoryStream(); bool needsCLRF = false; foreach (var param in postParameters) { if (needsCLRF) formDataStream.Write(encoding.GetBytes("\r\n"), 0, encoding.GetByteCount("\r\n")); needsCLRF = true; if (param.Value is FileParameter) { FileParameter fileToUpload = (FileParameter)param.Value; string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n", boundary, fileToUpload.Name, fileToUpload.FileName ?? param.Key, fileToUpload.ContentType ?? "application/octet-stream"); formDataStream.Write(encoding.GetBytes(header), 0, encoding.GetByteCount(header)); formDataStream.Write(fileToUpload.File, 0, fileToUpload.File.Length); } else { string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}", boundary, param.Key, param.Value); formDataStream.Write(encoding.GetBytes(postData), 0, encoding.GetByteCount(postData)); } } string footer = "\r\n--" + boundary + "--\r\n"; formDataStream.Write(encoding.GetBytes(footer), 0, encoding.GetByteCount(footer)); formDataStream.Position = 0; byte[] formData = new byte[formDataStream.Length]; formDataStream.Read(formData, 0, formData.Length); formDataStream.Close(); return formData; } /// /// /// public class FileParameter { /// /// /// public string Name { get; set; } /// /// /// public byte[] File { get; set; } /// /// /// public string FileName { get; set; } /// /// /// public string ContentType { get; set; } /// /// /// /// /// public FileParameter(string name, byte[] file) : this(name, file, null) { } /// /// /// /// /// /// public FileParameter(string name, byte[] file, string filename) : this(name, file, filename, null) { } /// /// /// /// /// /// /// public FileParameter(string name, byte[] file, string filename, string contenttype) { Name = name; File = file; FileName = filename; ContentType = contenttype; } } } }