| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
xpkdi
9年前发布

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

一、封装的类

    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();