CFormUpload.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using System.Net;
  2. using System.Text;
  3. namespace Hotline.DataSharing.Province
  4. {
  5. /// <summary>
  6. /// Post提交(包含文件提交)
  7. /// </summary>
  8. public class CFormUpload
  9. {
  10. private static readonly Encoding encoding = Encoding.UTF8;
  11. /// <summary>
  12. ///
  13. /// </summary>
  14. /// <param name="postUrl"></param>
  15. /// <param name="userAgent"></param>
  16. /// <param name="postParameters"></param>
  17. /// <param name="authorization"></param>
  18. /// <returns></returns>
  19. public static string MultipartFormDataPost(string postUrl, string userAgent, Dictionary<string, object> postParameters, string authorization = "")
  20. {
  21. string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid());
  22. string contentType = "multipart/form-data; boundary=" + formDataBoundary;
  23. byte[] formData = GetMultipartFormData(postParameters, formDataBoundary);
  24. HttpWebResponse webResponse = PostForm(postUrl, userAgent, contentType, formData, authorization);
  25. StreamReader responseReader = new StreamReader(webResponse.GetResponseStream());
  26. string fullResponse = responseReader.ReadToEnd();
  27. webResponse.Close();
  28. return fullResponse;
  29. }
  30. ///
  31. private static HttpWebResponse PostForm(string postUrl, string userAgent, string contentType, byte[] formData, string authorization = "")
  32. {
  33. HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest;
  34. if (request == null)
  35. {
  36. throw new NullReferenceException("request is not a http request");
  37. }
  38. // Set up the request properties.
  39. if (false == string.IsNullOrEmpty(authorization))
  40. {
  41. request.Headers.Add("Authorization", "Bearer " + authorization);
  42. }
  43. request.Method = "POST";
  44. request.ContentType = contentType;
  45. request.UserAgent = userAgent;
  46. request.CookieContainer = new CookieContainer();
  47. request.ContentLength = formData.Length;
  48. using (Stream requestStream = request.GetRequestStream())
  49. {
  50. requestStream.Write(formData, 0, formData.Length);
  51. requestStream.Close();
  52. }
  53. var result = request.GetResponse() as HttpWebResponse;
  54. return result;
  55. }
  56. private static byte[] GetMultipartFormData(Dictionary<string, object> postParameters, string boundary)
  57. {
  58. Stream formDataStream = new System.IO.MemoryStream();
  59. bool needsCLRF = false;
  60. foreach (var param in postParameters)
  61. {
  62. if (needsCLRF)
  63. formDataStream.Write(encoding.GetBytes("\r\n"), 0, encoding.GetByteCount("\r\n"));
  64. needsCLRF = true;
  65. if (param.Value is FileParameter)
  66. {
  67. FileParameter fileToUpload = (FileParameter)param.Value;
  68. string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n",
  69. boundary,
  70. fileToUpload.Name,
  71. fileToUpload.FileName ?? param.Key,
  72. fileToUpload.ContentType ?? "application/octet-stream");
  73. formDataStream.Write(encoding.GetBytes(header), 0, encoding.GetByteCount(header));
  74. formDataStream.Write(fileToUpload.File, 0, fileToUpload.File.Length);
  75. }
  76. else
  77. {
  78. string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}",
  79. boundary,
  80. param.Key,
  81. param.Value);
  82. formDataStream.Write(encoding.GetBytes(postData), 0, encoding.GetByteCount(postData));
  83. }
  84. }
  85. string footer = "\r\n--" + boundary + "--\r\n";
  86. formDataStream.Write(encoding.GetBytes(footer), 0, encoding.GetByteCount(footer));
  87. formDataStream.Position = 0;
  88. byte[] formData = new byte[formDataStream.Length];
  89. formDataStream.Read(formData, 0, formData.Length);
  90. formDataStream.Close();
  91. return formData;
  92. }
  93. /// <summary>
  94. ///
  95. /// </summary>
  96. public class FileParameter
  97. {
  98. /// <summary>
  99. ///
  100. /// </summary>
  101. public string Name { get; set; }
  102. /// <summary>
  103. ///
  104. /// </summary>
  105. public byte[] File { get; set; }
  106. /// <summary>
  107. ///
  108. /// </summary>
  109. public string FileName { get; set; }
  110. /// <summary>
  111. ///
  112. /// </summary>
  113. public string ContentType { get; set; }
  114. /// <summary>
  115. ///
  116. /// </summary>
  117. /// <param name="name"></param>
  118. /// <param name="file"></param>
  119. public FileParameter(string name, byte[] file) : this(name, file, null) { }
  120. /// <summary>
  121. ///
  122. /// </summary>
  123. /// <param name="name"></param>
  124. /// <param name="file"></param>
  125. /// <param name="filename"></param>
  126. public FileParameter(string name, byte[] file, string filename) : this(name, file, filename, null) { }
  127. /// <summary>
  128. ///
  129. /// </summary>
  130. /// <param name="name"></param>
  131. /// <param name="file"></param>
  132. /// <param name="filename"></param>
  133. /// <param name="contenttype"></param>
  134. public FileParameter(string name, byte[] file, string filename, string contenttype)
  135. {
  136. Name = name;
  137. File = file;
  138. FileName = filename;
  139. ContentType = contenttype;
  140. }
  141. }
  142. }
  143. }