C#多部分/表单数据MIME多部分流意外结束



我在接收多部分/表单数据POST请求时遇到问题,但我的身体内部无法解决问题。发送请求后,服务器响应我此错误

MIME多部分流意外结束。MIME多部分邮件不是完成

跟随请求正文。

-------BoundaryNg6f698dj968io34abg32rfa3
Content-Disposition: form-data; name="json"; filename="json"; Content-Type:application/json
{"key":"value","key":"value","key":"value","key":"value","key":"value"}
-------BoundaryNg6f698dj968io34abg32rfa3
Content-Disposition: form-data; name="style"; filename="style.css"; Content-Type:text/css
body {
width: 100%;
margin: 0;
padding: 0;
[etc etc]}

-------BoundaryNg6f698dj968io34abg32rfa3
Content-Disposition: form-data; name="play_circle"; filename="play_circle.png"; Content-Type:image/png

[Image]
-------BoundaryNg6f698dj968io34abg32rfa3

在我看来,所有的身体似乎都是正确的,但我累了,也许有人能帮我解决我的问题?

@编辑

跟随你可以看到我是如何构建多部分身体的:

这部分构建了Css和Json部分。

public byte[] bodyBuilder()
{
byte[] bodyAtt = new byte[1];
StringBuilder sb = new StringBuilder();
foreach (PostData p in postData)
{
sb.Append(string.Format("rn{0}", boundary));
sb.AppendLine("rn");
sb.Append(string.Format("Content-Disposition: form-data; name="{0}"; filename="{1}"; Content-Type:{2}", p.Name,p.FileName, p.Type));
sb.AppendLine("rn");
sb.Append(string.Format("{0}rn", p.Value));
}
bodyAtt = encoding.GetBytes(sb.ToString());
if (content_Type.Contains("multipart/form-data"))
{
bodyAtt = Combine(bodyAtt, setAttachPostData());
}
var str = Encoding.Default.GetString(bodyAtt);
string pathFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Log.txt");
File.WriteAllText(pathFile, str);
return bodyAtt;
}

这是为图像准备的。

public byte[] setAttachPostData()
{
byte[] bodyAtt = new byte[1];
foreach (PostDataParam p in postDataParams)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("rn");
sb.Append(string.Format("{0}", boundary));
sb.AppendLine("rn");
sb.AppendLine(string.Format("Content-Disposition: form-data; name="{0}"; filename="{1}"; Content-Type:{2}", p.Name, p.FileName, p.Type));
sb.AppendLine("rn");
bodyAtt = Combine(bodyAtt, encoding.GetBytes(sb.ToString()));                     bodyAtt = Combine(bodyAtt, p.data);
}
bodyAtt = Combine(bodyAtt, encoding.GetBytes(string.Format("rnrn{0}rn", boundary)));
return bodyAtt;
}

组合方法很简单:

public static byte[] Combine(byte[] first, byte[] second)
{
byte[] ret = new byte[first.Length + second.Length];
Buffer.BlockCopy(first, 0, ret, 0, first.Length);
Buffer.BlockCopy(second, 0, ret, first.Length, second.Length);
return ret;
}

我已经用这部分代码解决了这个问题:

public async Task<string> BuildMultipartAsync()
{
try
{
MultipartFormDataContent form = new MultipartFormDataContent();
foreach (PostData p in postData)
{
form.Add(new StringContent(p.Value), p.Name, p.FileName);
}
foreach (PostDataParam p in postDataParams)
{
form.Add(new ByteArrayContent(p.data, 0, p.data.Length), p.Name, p.FileName);
}
HttpResponseMessage response = await httpClient.PostAsync(URLCall, form);
response.EnsureSuccessStatusCode();
httpClient.Dispose();
string sd = response.Content.ReadAsStringAsync().Result;
return sd;
}catch (Exception e)
{
return e.Message;
}
}

引用自:

如何使用HTTPPOST多部分/表单数据将文件上传到服务器

希望能有所帮助。