【问题标题】:C# multipart/form-data Unexpected end of MIME multipart streamC# multipart/form-data MIME 多部分流的意外结束
【发布时间】:2018-07-11 15:07:10
【问题描述】:

我在接收 multipart/form-data 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("\r\n{0}", boundary));
                sb.AppendLine("\r\n");
                sb.Append(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"; Content-Type:{2}", p.Name,p.FileName, p.Type));
                sb.AppendLine("\r\n");
                sb.Append(string.Format("{0}\r\n", 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("\r\n");
                sb.Append(string.Format("{0}", boundary));
                sb.AppendLine("\r\n");
                sb.AppendLine(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"; Content-Type:{2}", p.Name, p.FileName, p.Type));
                sb.AppendLine("\r\n");
                bodyAtt = Combine(bodyAtt, encoding.GetBytes(sb.ToString()));                     bodyAtt = Combine(bodyAtt, p.data);
            }
            bodyAtt = Combine(bodyAtt, encoding.GetBytes(string.Format("\r\n\r\n{0}\r\n", boundary)));

            return bodyAtt;
        }

而 combine 方法很简单:

 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;
        }

【问题讨论】:

  • 你是如何生成这个的?您如何尝试解析它?请需要更多详细信息。
  • 这是流的“字符串”转换。现在我更新帖子。

标签: c# http-post multipartform-data


【解决方案1】:

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

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;
            }
        }

引用自:

How to upload file to server with HTTP POST multipart/form-data

希望能提供帮助。

【讨论】:

    猜你喜欢
    • 2022-07-12
    • 2016-12-31
    • 2012-11-26
    • 2021-05-18
    • 2013-12-10
    • 2017-05-12
    • 1970-01-01
    • 2013-09-06
    • 2019-04-04
    相关资源
    最近更新 更多