欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# POST 表单发送图片或文件

程序员文章站 2022-06-27 20:24:50
表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行创建产生,它会用来识别每一份资料的边界 (boundary),而 HTTP 服务器可以抓取 HTTP 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发送时传递即可