C# POST 表单发送图片或文件
表单提交协议规定:
要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,
这个参数是由应用程序自行产生,它会用来识别每一份资料的边界 (boundary),
用以产生多重信息部份 (message part)。
而 HTTP 服务器可以抓取 HTTP POST 的信息,
基本内容:
1. 每个信息部份都要用 --[BOUNDARY_NAME] 来包装,以分隔出信息的每个部份,而最后要再加上一个 --[BOUNDARY_NAME] 来表示结束。
2. 每个信息部份都要有一个 Content-Disposition: form-data; name="",而 name 设定的就是 HTTP POST 的键值 (key)。
3. 声明区和值区中间要隔两个新行符号(\r\n)。
4. 中间可以夹入二进制资料,但二进制资料必须要格式化为二进制字符串。
5. 若要设定不同信息段的资料型别 (Content-Type),则要在信息段内的声明区设定。
实际应用:
当提交文件到第三方的api地址上,比如图片,文档等,同时一般都会有参数key,value值一同发送,采取post方式,
下面给出post提交的方法代码:
public static string HttpPost(string url, IDictionary<string, string> param, byte[] fileByte,string fileName) { string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");//创建分隔符 HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url); wr.ContentType = "multipart/form-data; boundary=" + boundary; wr.Method = "POST"; wr.KeepAlive = true; wr.Credentials = System.Net.CredentialCache.DefaultCredentials; Stream rs = wr.GetRequestStream(); string responseStr = null; string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";//key value文本数据模板 foreach (string key in param.Keys) { rs.Write(boundarybytes, 0, boundarybytes.Length); string formitem = string.Format(formdataTemplate, key, param[key]); byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); rs.Write(formitembytes, 0, formitembytes.Length); } rs.Write(boundarybytes, 0, boundarybytes.Length); string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";//file文件模板 string header = string.Format(headerTemplate, "file", fileName, "application/octet-stream");//image/jpeg byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); rs.Write(headerbytes, 0, headerbytes.Length); rs.Write(fileByte, 0, fileByte.Length); byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); rs.Write(trailer, 0, trailer.Length); rs.Close(); WebResponse wresp = null; try { wresp = wr.GetResponse(); Stream stream2 = wresp.GetResponseStream(); StreamReader reader2 = new StreamReader(stream2); responseStr = reader2.ReadToEnd(); } catch (Exception ex) { if (wresp != null) { wresp.Close(); wresp = null; } throw; } return responseStr; }
注意下参数名,第三方api接收文件的时候参数名或已规定,比如file,filename,用header发送时传递即可
上一篇: 原生JS实现简单的汇率转换问题
下一篇: 阿里的 P8 和 P9 到底是什么水平
推荐阅读
-
C#模拟http 发送post或get请求的简单实例
-
C#获取某路径文件夹中全部图片或其它指定格式的文件名的实例方法
-
axios发送post请求,提交图片类型表单数据方法
-
C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)
-
C# GET/POST 发送HTTP请求,自动提交表单,模拟网页登录/网页注册。填坑
-
C# POST 表单发送图片或文件
-
springboot实现表单提交数据和上传文件或图片
-
C#获取某路径文件夹中全部图片或其它指定格式的文件名的实例方法
-
axios发送post请求,提交图片类型表单数据方法
-
C#模拟http 发送post或get请求的简单实例