The console simulates the post to submit the picture, and the background accepts the request and processes it [transfer]

Package class:
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;  
            }  
        }  
    }  
}   


Submit using wrapper class
Dictionary<string, object> postParameters = new Dictionary<string, object>();

            postParameters.Add("token", "123465789");
            //postParameters.Add("paramB", "value2");
            //postParameters.Add("paramC", "value3");
            byte[] data = ReadImageFile("c:\\123456.png");
            postParameters.Add("file1", new FormUpload.FileParameter(data, "123456.png", "image/png"));

            // Create request and receive response  
            string postURL = "http://localhost:4806/WebApi/V1/Account/ChangeUserCard";
            string userAgent = "Someone";
            HttpWebResponse webResponse = FormUpload.MultipartFormDataPost(postURL, userAgent, postParameters);

            // Process response  
            StreamReader responseReader = new StreamReader(webResponse.GetResponseStream());
            string fullResponse = responseReader.ReadToEnd();
            Console.WriteLine(fullResponse);
            Console.ReadKey();



Server accepts data
HttpRequest request = System.Web.HttpContext.Current.Request;
string token = request.Form["token"].ToString();

if (request.Files.Count <= 0) //If the number of file sets is less than or equal to 0, return an error
    return ResponseResult.GenFaildResponse(ResultCode.CodeTypeIsNull);

    foreach (string str in request.Files)
    {
        HttpPostedFile FileSave = request.Files[str]; //Get a single file object with key HttpPostedFile
        string AbsolutePath = "C:\\" + FileSave.FileName; //Set the absolute path of the image to be saved
        try
        {
            FileSave.SaveAs(AbsolutePath); //Save the uploaded things
         }
         catch
           {
                    WebAPIHelper.RecordOperationLog("1111","1111");
            }
      }





Client form form submission (without image parameters)
string postData = "user=123&pass=456"; // data to be issued
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            string url = "http://localhost:4806/WebApi/V1/Account/ChangeUserCard"; //Define the address to send the request

            HttpWebRequest objWebRequest = (HttpWebRequest)WebRequest.Create(url);
            objWebRequest.Method = "POST";
            objWebRequest.ContentType = "application/x-www-form-urlencoded";
            objWebRequest.ContentLength = byteArray.Length;
            Stream newStream = objWebRequest.GetRequestStream();
            // Send the data.
            newStream.Write(byteArray, 0, byteArray.Length); //写入参数
            newStream.Close();

            HttpWebResponse response = (HttpWebResponse)objWebRequest.GetResponse();
            StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
            string textResponse = sr.ReadToEnd(); // returned data



convert image to binary 
private static byte[] ReadImageFile(string path)
{
            FileStream fs = File.OpenRead(path); //OpenRead
            int filelength = 0;
            filelength = (int)fs.Length; //Get the file length
            Byte[] image = new Byte[filelength]; //Create a byte array
            fs.Read(image, 0, filelength); //read by byte stream

            System.Drawing.Image img = System.Drawing.Image.FromStream(fs);
            return ImgHelper.ImageToBytes(img);
            //Console.WriteLine(array.ToString());
            //Console.ReadKey();
}



Remarks:
1. Encapsulation class and request method, refer to: http://blog.csdn.net/wangjijun0807/article/details/40053679?locationNum=15
2. The ResponseResult statement received by the server can be ignored
3. Send post with pictures In the requested method, the processing method of the image is placed at the end

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326617753&siteId=291194637