HttpWebRequest上传多文件和多参数——整理

1.整理HttpWebRequest上传多文件和多参数。较上一个版本,更具普适性和简易型。注意(服务方web.config中要配置)这样就可以上传大文件了

<system.webServer>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="4294967295" />
      </requestFiltering>
</system.webServer>
<system.web>
    <httpRuntime  maxRequestLength="2048000"/>
</system.web>

2.HttpWebRequest的封装

  /// <summary>
    /// Http上传文件类 - HttpWebRequest封装
    /// </summary>
    public class HttpUploadClient
    {
        public static string ExecuteMultipartRequest(string url, List<KeyValue> nvc)
        {
            string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
            byte[] boundarybytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");

            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url, UriKind.RelativeOrAbsolute));
            webRequest.Method = "POST";
            webRequest.Timeout = 1800000;
            webRequest.ContentType = "multipart/form-data; boundary=" + boundary;
            webRequest.KeepAlive = true;
            webRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
            using (var rs = webRequest.GetRequestStream())
            {
                // 普通参数模板
                string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
                //带文件的参数模板
                string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
                foreach (KeyValue keyValue in nvc)
                {
                    //如果是普通参数
                    if (keyValue.FilePath == null)
                    {
                        rs.Write(boundarybytes, 0, boundarybytes.Length);
                        string formitem = string.Format(formdataTemplate, keyValue.Key, keyValue.Value);
                        byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                        rs.Write(formitembytes, 0, formitembytes.Length);
                    }
                    //如果是文件参数,则上传文件
                    else
                    {
                        rs.Write(boundarybytes, 0, boundarybytes.Length);
                        string header = string.Format(headerTemplate, keyValue.Key, keyValue.Value, keyValue.ContentType);
                        byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
                        rs.Write(headerbytes, 0, headerbytes.Length);
                        using (var fileStream = new FileStream(keyValue.FilePath, FileMode.Open, FileAccess.Read))
                        {
                            byte[] buffer = new byte[4096];
                            int bytesRead = 0;
                            long total = 0;
                            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                            {
                                rs.Write(buffer, 0, bytesRead);
                                total += bytesRead;
                            }
                        }
                    }

                }
                byte[] trailer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
                rs.Write(trailer, 0, trailer.Length);
                rs.Close();
            }

            // 获取响应
            using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
            {
                using (StreamReader reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
                {
                    string body = reader.ReadToEnd();
                    reader.Close();
                    return body;
                }
            }
        }

3.参数封装(支持普通参数和多文件)

  public class KeyValue
    {
        public string Key;
        public string Value;
        public string FilePath;
        public string ContentType = "*/*";
        public KeyValue(string key, string value, string filePath, string contentType)
        {
            Key = key;
            Value = value;
            FilePath = filePath;
            ContentType = contentType;
        }
        public KeyValue() { }
        public KeyValue(string key, string value, string filePath)
        {
            Key = key;
            Value = value;
            FilePath = filePath;
        }
        public KeyValue(string key, string value)
        {
            Key = key;
            Value = value;
        }
    }

4.调用示例

            List<KeyValue> keyValues = new List<KeyValue>();
            keyValues.Add(new KeyValue("key1", "12_423232523"));
            keyValues.Add(new KeyValue("key2", " 1 2 3"));
            keyValues.Add(new KeyValue("file1", "1.img", @"C:\临时\tempDB\1.img"));
            keyValues.Add(new KeyValue("file2", "2.xls", @"C:\临时\tempDB\2.xls"));
            HttpUploadClient.ExecuteMultipartRequest(url, keyValues);

5.服务接收方示例

  for (int i = 0; i < HttpContext.Current.Request.Files.Count; i++)
  {
       HttpPostedFile file = HttpContext.Current.Request.Files[i];
       file.SaveAs(""+file.FileName);
  }
  string Params = HttpContext.Current.Request.Form["key1"];

  

posted @ 2016-12-02 16:30  那是山  阅读(1401)  评论(0编辑  收藏  举报