zoukankan      html  css  js  c++  java
  • 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("
    --" + boundary + "
    ");
    
                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}"
    
    {1}";
                    //带文件的参数模板
                    string headerTemplate = "Content-Disposition: form-data; name="{0}"; filename="{1}"
    Content-Type: {2}
    
    ";
                    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("
    --" + boundary + "--
    ");
                    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:临时	empDB1.img"));
                keyValues.Add(new KeyValue("file2", "2.xls", @"C:临时	empDB2.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"];
    

      

  • 相关阅读:
    UML类图和用例图
    设计模式基本原则
    c# 协变和逆变
    git本地忽略
    计算器科学概论-数据操控
    计算机科学概论-数据存储
    docker部署gitlab-ce
    sqlserver2008R2 本地不能用localhost连接
    Redis常用命令
    C# 值类型和引用类型的区别
  • 原文地址:https://www.cnblogs.com/xibei/p/6126277.html
Copyright © 2011-2022 走看看