用 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 形式:
我也是用asp。net,卡在post-body这步,网上多数是其他语言的例子,c#只搜到这篇好文,值得推介