HttpWebRequest 實現多文件和多參數傳送

 HttpWebRequest 請求方

測試Form窗體

private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.Multiselect = false;
            fileDialog.Title = "请选择文件";
            fileDialog.Filter = "所有文件(*.*)|*.*";
            if (fileDialog.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.Text += fileDialog.FileName + "\r\n";
            } 
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                string Url = "http://localhost:60877/Handlers/HTTPHandler.ashx";
                Dictionary<string, string> dictionary = new Dictionary<string, string>();
                dictionary.Add("httptype", "E2");
                dictionary.Add("userid", "D025575");
                dictionary.Add("mailnos", "CCC00");
                List<HTTPHelper.HTTPFiles> AttachFile = new List<HTTPHelper.HTTPFiles>();
                if (richTextBox1.Text != "")
                {
                    int id = 0;
                    foreach (string Attach in richTextBox1.Lines)
                    {
                        id++;
                        if (Attach != "")
                        {
                            HTTPHelper.HTTPFiles At = new HTTPHelper.HTTPFiles();
                            At.FilePath = Attach;
                            At.FileGuid = id.ToString();
                            AttachFile.Add(At);
                        }
                    }
                }

                string Result = HTTPHelper.HTTPHelper.HttpPostMutiData(Url, dictionary, AttachFile, 300000);
                MessageBox.Show(Result);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

 HTTPHelper 類

 private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        }

        /// <summary>
        /// 將文件轉化為請求數據流
        /// </summary>
        /// <param name="httpWebRequest"></param>
        /// <param name="HFiles"></param>
        private static void PostHFileStream(Stream postStream, List<HTTPFiles> HFiles, byte[] itemBoundaryBytes)
        {
            try
            {
                int HCount = HFiles.Count;
                if (HCount > 0)
                {
                    for (int i = 0; i < HCount; i++)
                    {
                        if (File.Exists(HFiles[i].FilePath))
                        {
                            string fileName = "";
                            if (HFiles[i].FileGuid != "")
                            {
                                fileName = HFiles[i].FileGuid + HFiles[i].FileExt;//爲了防止文件名重複
                            }
                            else
                            {
                                fileName = HFiles[i].FileName;
                            }
                            //请求头部信息
                            StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", HFiles[i].FileGuid + HFiles[i].FileExt));
                            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());

                            FileStream fs = new FileStream(HFiles[i].FilePath, FileMode.Open, FileAccess.Read);
                            byte[] bArr = new byte[fs.Length];
                            fs.Read(bArr, 0, bArr.Length);
                            fs.Close();
                            postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
                            postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                            postStream.Write(bArr, 0, bArr.Length);                           
                           
                           
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 將打包參數轉化為數據流
        /// </summary>
        /// <param name="httpWebRequest"></param>
        /// <param name="parameters"></param>
        private static void PostParamsStream(Stream postStream, IDictionary<string, string> parameters, byte[] itemBoundaryBytes)
        {
            try
            {
                if (parameters.Count > 0)
                {
                    Encoding encoding = Encoding.GetEncoding("utf-8");                         
                    string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";                
                    foreach (string current in parameters.Keys)
                    {                      
                        string formitem = string.Format(formdataTemplate, current, parameters[current]);
                        byte[] bytes = encoding.GetBytes(formitem.ToString());
                        postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
                        postStream.Write(bytes, 0, bytes.Length);  
                    }                  
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 獲取請求返回值
        /// </summary>
        /// <param name="response"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        private static string GetResponseString(HttpWebResponse response, Encoding encoding)
        {
            string result;
            using (Stream responseStream = response.GetResponseStream())
            {
                string @string;
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                    {
                        new GZipStream(responseStream, CompressionMode.Decompress).CopyTo(memoryStream, 2048);
                    }
                    else
                    {
                        responseStream.CopyTo(memoryStream, 2048);
                    }
                    byte[] array = memoryStream.ToArray();
                    @string = encoding.GetString(array);
                    string value = Regex.Match(@string, "<meta.*?charset=\"?([a-z0-9-]+)\\b", RegexOptions.IgnoreCase).Groups[1].Value;
                    if (value != "" && value.ToLower().IndexOf("utf") == -1)
                    {
                        try
                        {
                            @string = Encoding.GetEncoding(value).GetString(array, 0, array.Length);
                        }
                        catch
                        {
                        }
                    }
                }
                result = @string;
            }
            return result;
        }
        /// <summary>
        /// 綜合請求Post資料
        /// </summary>
        /// <param name="url"></param>
        /// <param name="parameters">字符串參數</param>
        /// <param name="HFiles">文件清單</param>
        /// <param name="timeout">超時限制</param>
        /// <returns></returns>
        public static string HttpPostMutiData(string url, IDictionary<string, string> parameters, List<HTTPFiles> HFiles, int timeout)
        {
            string result;
            try
            {                  
                HttpWebRequest httpWebRequest = null;
                Encoding encoding = Encoding.GetEncoding("utf-8");
                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(HTTPHelper.CheckValidationResult);
                    httpWebRequest = (WebRequest.Create(url) as HttpWebRequest);
                }
                else
                {
                    httpWebRequest = (WebRequest.Create(url) as HttpWebRequest);
                }
                httpWebRequest.KeepAlive = true;
                httpWebRequest.Method = "POST";
                httpWebRequest.AllowAutoRedirect = true;//開啟允許自動重新定向
                CookieContainer cookieContainer = new CookieContainer();
                httpWebRequest.CookieContainer = cookieContainer;
                string boundary = DateTime.Now.Ticks.ToString("X"); // 微秒轉換為16進制的數字 作為分割線 每個參數前用分割線區分,參數結束分割線結束
                httpWebRequest.ContentType = "multipart/form-data;charset=utf-8;;boundary=" + boundary;
                byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
                byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
                httpWebRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");//允許接受壓縮數據
                Stream requestStream = httpWebRequest.GetRequestStream();              
                if (HFiles!=null&&HFiles.Count > 0)
                {
                    PostHFileStream(requestStream, HFiles, itemBoundaryBytes);//文件傳送,打包文件流
                    if (parameters == null)
                    {
                        parameters = new Dictionary<string, string>();
                    }
                    parameters.Add("HFiles", JsonConvert.SerializeObject(HFiles));//文件對應的屬性,轉化為Json字符串,作為字符串參數傳遞
                }
                if (parameters != null && parameters.Count > 0)
                {
                    PostParamsStream(requestStream, parameters,itemBoundaryBytes);//字符串參數
                }
                requestStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);//結束分割線
                requestStream.Close();//關閉流
                result = HTTPHelper.GetResponseString(httpWebRequest.GetResponse() as HttpWebResponse, encoding);
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

 

接收方 一般處理文件

public class HTTPHandler : IHttpHandler {
    
    public void ProcessRequest (HttpContext context) {

        HTTPControl.BaseHandler action = null;

        string acStr = context.Request["httptype"];
        if (acStr == null)
        {
            context.Response.Write("0");
            return; 
        }       
        switch (acStr)
        {
            case "E2":
                action = new HTTPControl.FHTTPTest(context);
                break;
        }
        if (action == null)
        {
            context.Response.Write("0");
        }
        else
        {
            action.Process();
        }
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值