C#客户端使用 http form的post方法提交图片

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
一、封装的类
    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.Net;  
    using System.IO;  
      
    namespace WpfApplication1  
    {  
        public static class FormUpload  
        {  
            private static readonly Encoding encoding = Encoding.UTF8;  
            public static HttpWebResponse MultipartFormDataPost(string postUrl, string userAgent, Dictionary<string, object> postParameters)  
            {  
                string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid());  
                //string contentType = "multipart/form-data; boundary=" + formDataBoundary;  
                string contentType = "multipart/form-data; boundary=" + formDataBoundary;  
      
      
                byte[] formData = GetMultipartFormData(postParameters, formDataBoundary);  
      
                return PostForm(postUrl, userAgent, contentType, formData);  
            }  
            private static HttpWebResponse PostForm(string postUrl, string userAgent, string contentType, byte[] formData)  
            {  
                HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest;  
      
                if (request == null)  
                {  
                    throw new NullReferenceException("request is not a http request");  
                }  
      
                // Set up the request properties.  
                request.Method = "POST";  
                request.ContentType = contentType;  
                request.UserAgent = userAgent;  
                request.CookieContainer = new CookieContainer();  
                request.ContentLength = formData.Length;  
      
                // You could add authentication here as well if needed:  
                // request.PreAuthenticate = true;  
                // request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;  
                // request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes("username" + ":" + "password")));  
      
                // Send the form data to the request.  
                using (Stream requestStream = request.GetRequestStream())  
                {  
                    requestStream.Write(formData, 0, formData.Length);  
                    requestStream.Close();  
                }  
      
                return request.GetResponse() as HttpWebResponse;  
            }  
      
            private static byte[] GetMultipartFormData(Dictionary<string, object> postParameters, string boundary)  
            {  
                Stream formDataStream = new System.IO.MemoryStream();  
                bool needsCLRF = false;  
      
                foreach (var param in postParameters)  
                {  
                    // Thanks to feedback from commenters, add a CRLF to allow multiple parameters to be added.  
                    // Skip it on the first parameter, add it to subsequent parameters.  
                    if (needsCLRF)  
                        formDataStream.Write(encoding.GetBytes("\r\n"), 0, encoding.GetByteCount("\r\n"));  
      
                    needsCLRF = true;  
      
                    if (param.Value is FileParameter)  
                    {  
                        FileParameter fileToUpload = (FileParameter)param.Value;  
      
                        // Add just the first part of this param, since we will write the file data directly to the Stream  
                        string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n",  
                            boundary,  
                            param.Key,  
                            fileToUpload.FileName ?? param.Key,  
                            fileToUpload.ContentType ?? "application/octet-stream");  
      
                        formDataStream.Write(encoding.GetBytes(header), 0, encoding.GetByteCount(header));  
      
                        // Write the file data directly to the Stream, rather than serializing it to a string.  
                        formDataStream.Write(fileToUpload.File, 0, fileToUpload.File.Length);  
                    }  
                    else  
                    {  
                        string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}",  
                            boundary,  
                            param.Key,  
                            param.Value);  
                        formDataStream.Write(encoding.GetBytes(postData), 0, encoding.GetByteCount(postData));  
                    }  
                }  
      
                // Add the end of the request.  Start with a newline  
                string footer = "\r\n--" + boundary + "--\r\n";  
                formDataStream.Write(encoding.GetBytes(footer), 0, encoding.GetByteCount(footer));  
      
                // Dump the Stream into a byte[]  
                formDataStream.Position = 0;  
                byte[] formData = new byte[formDataStream.Length];  
                formDataStream.Read(formData, 0, formData.Length);  
                formDataStream.Close();  
      
                return formData;  
            }  
      
            public class FileParameter  
            {  
                public byte[] File { get; set; }  
                public string FileName { get; set; }  
                public string ContentType { get; set; }  
                public FileParameter(byte[] file) : this(file, null) { }  
                public FileParameter(byte[] file, string filename) : this(file, filename, null) { }  
                public FileParameter(byte[] file, string filename, string contenttype)  
                {  
                    File = file;  
                    FileName = filename;  
                    ContentType = contenttype;  
                }  
            }  
        }  
    }   

二、使用封装的类,提交数据(包含文本及图片)

    Dictionary<string, object> postParameters = new Dictionary<string, object>();  
      
                postParameters.Add("paramA", "value1");  
                postParameters.Add("paramB", "value2");  
                postParameters.Add("paramC", "value3");  
      
                postParameters.Add("picture", new FormUpload.FileParameter(data, "11.jpg", "image/jpg"));  
      
                // Create request and receive response  
                string postURL = global_ip + "service/PostImageAsBinty/";  
                string userAgent = "Someone";  
                HttpWebResponse webResponse = FormUpload.MultipartFormDataPost(postURL, userAgent, postParameters);  
      
                // Process response  
                StreamReader responseReader = new StreamReader(webResponse.GetResponseStream());  
                string fullResponse = responseReader.ReadToEnd();  
                webResponse.Close();  


标签: isp

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:PHP格式化时间,几分钟前,几小时前

下一篇:IOS校验验证手机号,信用卡号,电话号码,邮编,Email等