评论

用HTTP-API方式上传文件时构造 post-body

用HTTP-API方式上传文件时构造 post-body

用 HTTP-API 方式上传文件到云存储,在获取文件上传链接后,用获取到的链接上传文件时,需要构造一个 post-body 块。该块包含 5 项内容,每项的格式类似,注意下面文本内容第四行的最后,包含一个回车换行符([0D][0A]):

---KuTh71Gh
Content-Disposition: form-data; name="key"

mydoc1/mydoc2/mydoc3.doc


这 5 项最后的 file 项,其值是要上传文件的二进制内容,可用字节读取方式来读取文件,得到数组式字节流 fbytes:(以下代码均以 Csharp2 为例)

FileStream fs = new FileStream();
byte[] fbytes = new byte[fs.Length];
int n = fs.Read(fbytes[])

注意在文件内容块末尾加一个回车换行符,因为各项的数值都以此结束。post-body块的结尾格式(末尾包含一个回车换行)如下:

---KuTh71Gh---

在交给 WebRequest 执行发送前,要把 5 项内容(除文件内容块)转换为数组式字节流,注意字符串编码为 UTF8:

byte[] bytes = Encoding.UTF8.GetBytes(postbody);

在执行 WebRequest 时,注意ContentType 设置:

WebRequest.ContentLength = bytes.Length;
WebRequest.ContentType   = "multipart/form-data; boundary=KuTh71Gh";
WebRequest.GetRequestStream().Write(bytes, 0, bytes.Length);


上面所列指令仅为示意。整个过程的测试环境为 Win10,IIS10,ASP.NET4.5,Edge44。在 WinXP环境测试时,发现需处理 https 证书认证问题。网上有代码经测试可用:

Util.SetCertificatePolicy();
WebRequest request = WebRequest.Create(url);
internal static class Util
{
        // Sets the cert policy.
        public static void SetCertificatePolicy(){ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;}
        // Remotes the certificate validate.
        private static bool RemoteCertificateValidate(object sender, X509Certificate cert,X509Chain chain, SslPolicyErrors error){return true;}
}


附录:

http 1.1 的 post body (file up)格式样例

Hex 形式:

Text 形式:

最后一次编辑于  2020-06-18  
点赞 1
收藏
评论

1 个评论

  • 神出鬼没
    神出鬼没
    2020-06-28

    我也是用asp。net,卡在post-body这步,网上多数是其他语言的例子,c#只搜到这篇好文,值得推介

    2020-06-28
    赞同
    回复 2
    • 天天码
      天天码
      2020-06-28
      谢谢您,我已解决!用js的方式处理貌似简单多了。这个文档的链接不知对您是否有用?https://cloud.tencent.com/document/product/876/34658
      2020-06-28
      回复
    • 神出鬼没
      神出鬼没
      2020-06-29回复天天码
      找到两篇博客,测试发现出错,还好作者留下国外源码链接,发现是作者乱改格式,用原版一次成功
      2020-06-29
      回复
登录 后发表内容