当前位置: 移动技术网 > IT编程>开发语言>.net > C# POST 表单发送图片或文件

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

2020年04月29日  | 移动技术网IT编程  | 我要评论

infre,金堂县,长兴杀人案

表单提交协议规定:
要先将 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;
 }

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网