using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; namespace MySystem { public class HttpUpload { private ArrayList bytesArray; private Encoding encoding = Encoding.UTF8; private string boundary = String.Empty; public HttpUpload() { bytesArray = new ArrayList(); // string flag = DateTime.Now.Ticks.ToString("x"); // boundary = "---------------------------" + flag; } /// /// 合并请求数据 /// /// private byte[] MergeContent() { int length = 0; int readLength = 0; // string endBoundary = "--" + boundary + "--\r\n"; // byte[] endBoundaryBytes = encoding.GetBytes(endBoundary); // bytesArray.Add(endBoundaryBytes); foreach (byte[] b in bytesArray) { length += b.Length; } byte[] bytes = new byte[length]; foreach (byte[] b in bytesArray) { b.CopyTo(bytes, readLength); readLength += b.Length; } return bytes; } /// /// 上传 /// /// 请求url /// 响应 /// public bool Upload(String requestUrl, out String responseText, Dictionary Headers) { WebClient webClient = new WebClient(); foreach (string key in Headers.Keys) { webClient.Headers.Add(key, Headers[key]); } webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=boundary"); byte[] responseBytes; byte[] bytes = MergeContent(); try { responseBytes = webClient.UploadData(requestUrl, bytes); responseText = System.Text.Encoding.UTF8.GetString(responseBytes); return true; } catch (WebException ex) { Stream responseStream = ex.Response.GetResponseStream(); responseBytes = new byte[ex.Response.ContentLength]; responseStream.Read(responseBytes, 0, responseBytes.Length); } responseText = System.Text.Encoding.UTF8.GetString(responseBytes); return false; } /// /// 设置表单数据字段 /// /// 字段名 /// 字段值 /// public void SetFieldValue(String fieldName, String fieldValue) { string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n"; string httpRowData = String.Format(httpRow, fieldName, fieldValue); bytesArray.Add(encoding.GetBytes(httpRowData)); } public void SetFieldValueForCus(String content) { bytesArray.Add(encoding.GetBytes(content)); } /// /// 设置表单文件数据 /// /// 字段名 /// 字段值 /// 内容内型 /// 文件字节流 /// public void SetFieldValue(String fieldName, String filename, String contentType, Byte[] fileBytes) { string end = "\r\n"; string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; string httpRowData = String.Format(httpRow, fieldName, filename, contentType); byte[] headerBytes = encoding.GetBytes(httpRowData); byte[] endBytes = encoding.GetBytes(end); byte[] fileDataBytes = new byte[headerBytes.Length + fileBytes.Length + endBytes.Length]; headerBytes.CopyTo(fileDataBytes, 0); fileBytes.CopyTo(fileDataBytes, headerBytes.Length); endBytes.CopyTo(fileDataBytes, headerBytes.Length + fileBytes.Length); bytesArray.Add(fileDataBytes); } } }