HttpClient 如何同时发送图片和 JSON 数据的 multipart/form-data POST 请求

4

我正在尝试使用c#代码上传图像和JSON数据,但服务器总是返回400-错误请求。使用fiddler执行相同的请求返回状态码200。求助...

以下是我的Fiddler代码:

------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="application/json" Content-Type: application/json

{"type": "Personal","comments": ["Lorem", "Ipsum" ] } ------WebKitFormBoundary7MA4YWxkTrZu0gW-- Content-Disposition: form-data; name="fieldNameHere"; filename="1111.jpg"

Content-Type: image/jpeg

<@INCLUDE C:\Users\user\Desktop\New folder\1111.jpg@>

c#中的实现方式:

var boundary = "Upload----" + DateTime.Now.Ticks.ToString();
MultipartFormDataContent form = new MultipartFormDataContent(boundary);
StringContent content = new StringContent(bodyJson);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
form.Add(content, "application/json");

var imageContent = new ByteArrayContent(image);
imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg");
form.Add(imageContent, "image/jpeg", "image.jpg");
var responseTask = _httpClient.PostAsync(url, form).Result;

响应始终相同:

输入图像描述


你比较了这些帖子吗?向我们展示程序发送的信息。你可以使用Fiddler获取它。 - kara
然后我猜测:您在设置content.Header.ContentType为application/json之后,又将其覆盖为image/jpeg。我认为您想要添加两个"content-type"头部,这是不允许的。您在Fiddler中做了什么?您能够添加两个content-types吗? - kara
1
你需要找出你实际上正在发送什么。如果你无法控制服务器,并且无法在客户端上设置 Fiddler,那么你需要做的是创建一个简单的 ASP.NET 项目来接受表单提交,并将客户端指向该项目。 - GrandOpener
请看这个链接:https://dev59.com/A2865IYBdhLWcg3wceRU - kara
@tequilaslammer 我试过Charles,它可以记录模拟器的操作(例如使用Safari或在地图上搜索),但无法记录我的Xamarin.iOS应用程序...我不知道为什么。你有没有用过它来记录Xamarin应用程序? - Nininea
显示剩余2条评论
1个回答

3
你可以将参数作为字符串内容传递,查看下面的示例。
public async Task<JObject> ExecutePostAsync(Stream myStreem, string url, string token, string parameter1, string parameter2, string parameter3)
    {
        try
        {
            using (var content = new MultipartFormDataContent("----MyBoundary"))
            {

                using (var memoryStream = myStreem)
                {
                    using (var stream = new StreamContent(memoryStream))
                    {
                        content.Add(stream, "file", Guid.NewGuid().ToString() + ".jpg");
                        content.Add(new StringContent(parameter1), "parameter1");
                        content.Add(new StringContent(parameter3), "parameter2");
                        content.Add(new StringContent(parameter3), "parameter3");

                        using (HttpClient client = new HttpClient())
                        {
                            client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
                            var responce = await client.PostAsync(url, content);
                            string contents = await responce.Content.ReadAsStringAsync();
                            return (JObject.Parse(contents));
                        }

                    }
                }
            }

        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

在API中从FORM请求获取数据

    public async Task<IHttpActionResult> UploadFile()
    {

        string parameter1 = HttpContext.Current.Request.Form["parameter1"];
        string parameter2 = HttpContext.Current.Request.Form["parameter2"];
        string parameter3 = HttpContext.Current.Request.Form["parameter3"];

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接