`

控制台模拟post提交图片,后台接受请求并处理【转】

c# 
阅读更多
封装类:
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("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();



服务端接受数据
HttpRequest request = System.Web.HttpContext.Current.Request;
string token = request.Form["token"].ToString();

if (request.Files.Count <= 0)   //如果file集合的数量小于等于0,则返回错误
    return ResponseResult.GenFaildResponse(ResultCode.CodeTypeIsNull);

    foreach (string str in request.Files)
    {
        HttpPostedFile FileSave = request.Files[str];  //用key获取单个文件对象HttpPostedFile
        string AbsolutePath = "C:\\" + FileSave.FileName;  //设置要存储的图片的绝对路径
        try
        {
            FileSave.SaveAs(AbsolutePath);              //将上传的东西保存
         }
         catch
           {
                    WebAPIHelper.RecordOperationLog("1111","1111");
            }
      }





客户端form表单提交(不带图片参数)
string postData = "user=123&pass=456"; // 要发放的数据 
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            string url = "http://localhost:4806/WebApi/V1/Account/ChangeUserCard";  //定义发送请求的地址

            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(); // 返回的数据



将图片转化为二进制 
private static byte[] ReadImageFile(string path)
{
            FileStream fs = File.OpenRead(path); //OpenRead
            int filelength = 0;
            filelength = (int)fs.Length; //获得文件长度 
            Byte[] image = new Byte[filelength]; //建立一个字节数组 
            fs.Read(image, 0, filelength); //按字节流读取

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



备注:
1、封装类及发请求方法,参考自:http://blog.csdn.net/wangjijun0807/article/details/40053679?locationNum=15
2、服务端接收ResponseResult语句可忽略
3、带图片发送post请求的方法中,对图片的处理方法,放在了最后面
分享到:
评论

相关推荐

    c#模拟浏览器请求

    为了模拟更复杂的浏览器请求,如POST请求,你需要设置请求头和请求体。例如,对于一个POST请求,你可以这样做: ```csharp using System.Net.Http.Headers; // ... static async Task SendPostRequestAsync...

    浏览器调试ajax请求

    本示例旨在帮助开发者调试针对Ajax请求的后台接口,确保它们能够正确处理跨域请求、支持Ajax方式并且能返回预期的数据。 首先,我们需要理解什么是跨域问题。由于浏览器的安全策略,同一源策略限制了JavaScript只能...

    httpClient测试工具

    这个工具对于后端接口的调试和测试工作极其有用,因为它允许开发者模拟不同的网络请求,并查看服务器的响应,从而帮助找出可能存在的问题或优化接口性能。 在使用HttpClient进行web请求时,首先需要创建一个...

    java版创蓝短信接入demo

    发送短信前,记得先在创蓝后台开启测试模式,这样不会实际发送短信,而是返回模拟结果。测试成功后,再切换到正式环境,确保一切正常。 总的来说,接入创蓝短信服务涉及网络编程、JSON操作和错误处理等基本技能。`...

    java获取某地天气

    这些库允许我们构造GET或POST请求,并设置请求头,如`Accept`(指定接收的数据格式)和`User-Agent`(模拟浏览器)。 2. **JSON解析**:大多数天气API返回的数据格式是JSON(JavaScript Object Notation),因此...

    Auto-官方网站提取文档.doc

    Auto.js 的文档分为多个模块,包括自动操作、应用、设备、控制台、脚本引擎、事件与监听、悬浮窗、文件系统、HTTP、图片和图色处理、按键模拟、Shell 命令、多线程支持、UI 界面等。 自动操作模块中,基于控件和...

    C#写的仿qq2008的登录界面

    综上所述,创建一个仿QQ2008的登录界面涉及到C#的Windows Forms应用开发,UI设计,事件处理,数据验证,密码安全,模拟网络请求,错误处理,代码组织,以及测试与调试等多个关键知识点。通过实践这些技能,开发者...

    postman 插件

    作为一个插件,Postman在各种操作系统上都可以使用,包括Mac版,它允许用户轻松地发送HTTP请求并接收响应,以此来测试和理解后台接口的功能。 1. **Postman的基本功能**: - **请求构造**:Postman支持GET、POST、...

    Laravel开发-laravel-paytm

    创建一个服务提供者和服务类,用于处理 PayTM 请求和响应。在 `app/Providers` 目录下创建一个新的服务提供者,例如 `PaytmServiceProvider.php`,并注册 PayTM 客户端实例到服务容器中。 在 `app/Services` 目录下...

    基于androidpn设计的android客户端远程推送demo

    服务器需要处理与FCM的接口交互,包括构建推送消息、编码消息内容、以及发送POST请求到FCM服务器。 4. **处理推送消息**:在Android客户端,你需要定义一个BroadcastReceiver来接收来自FCM的消息。接收到消息后,...

    vue 运用mock数据的示例代码

    这段代码中,我们使用 axios 库来请求虚拟的 API,获取虚拟的数据 getBoardList,并在控制台中打印出返回的数据。 使用 mock 数据可以加速 vue 项目的开发速度,减少对真实后台接口的依赖。通过使用 mockjs 库和 ...

    WordPress目录和文件介绍.doc

    - **wp-comments-post.php**:接收用户提交的评论,并将其存储到数据库中,是用户互动的关键。 - **wp-commentsrss2.php**:生成RSS2格式的评论信息聚合,方便用户订阅和跟踪评论动态。 - **wp-config-sample....

    Android应用源码之消息推送最新demo +服务器.zip

    3. `MyFirebaseMessagingService.java`: 自定义的Firebase消息服务,会接收到FCM服务器发送过来的消息并进行处理,例如展示通知或者进行后台逻辑处理。 服务器端的实现通常涉及到创建和发送推送消息到FCM服务。这...

    C#创建windows服务+Form+Web调用服务

    在IT领域,Windows服务是一种在后台运行的程序,它不受用户界面的影响,可以在系统启动时自动启动,并且能够持续运行,通常用于执行计划任务或提供持续的服务。C#作为.NET框架的主要编程语言,提供了丰富的API来创建...

    service-worker-testing:测试服务工作者API

    服务工作者主要负责拦截网络请求,并根据预设策略进行处理。它们在安装时会被注册到特定的源和路径,一旦激活,就能接管对指定范围内的网络请求。服务工作者不直接与用户交互,但可以通过`postMessage()` API与主线...

    php+jQuery+Ajax简单实现页面异步刷新

    为了使后台能返回更复杂的结构,例如数组,我们可以修改jQuery代码,使用`$.ajax`方法并设置`dataType: "json"`。这要求服务器返回JSON格式的数据。修改后的HTML代码如下: ```html &lt;title&gt;JQueryAjax+...

    vue如何在项目中调用腾讯云的滑动验证码

    只需将前端返回的验证结果填入调试工具,然后模拟发送请求,查看返回的验证结果,以确保前端与腾讯云的交互正常。 总结一下,Vue项目中调用腾讯云滑动验证码的步骤包括: 1. 注册腾讯云验证码服务,获取AppID和App...

Global site tag (gtag.js) - Google Analytics