Httpclient multipart/form-data同时发布图片和json

Posted

技术标签:

【中文标题】Httpclient multipart/form-data同时发布图片和json【英文标题】:Httpclient multipart/form-data post image and json same time 【发布时间】:2018-01-09 08:59:32 【问题描述】:

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

这是我的提琴手代码:

------WebKitFormBoundary7MA4YWxkTrZu0gW 内容配置:表单数据; name="application/json" 内容类型:application/json

"type": "Personal","cmets": ["Lorem", "Ipsum" ] ------WebKitFormBoundary7MA4YWxkTrZu0gW-- Content-Disposition: form-data; name="fieldNameHere";文件名="1111.jpg"

内容类型:图片/jpeg

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 在 mac 中不能正常工作 那我猜:你将 content.Header.ContentType 设置为 application/json 之后你用 image/jpeg 覆盖它。我认为您正在尝试添加两个不允许的标题“内容类型”。你在提琴手做了什么?你能添加两种内容类型吗? 您将不得不找出您实际发送的内容。如果您无法控制服务器,并且无法在客户端上设置提琴手,则需要执行一些操作,例如创建一个简单的 ASP.NET 项目来接受表单发布,并将客户端指向该项目。 看看这个:***.com/questions/3808016/… 【参考方案1】:

您可以将参数作为字符串内容传递,请查看以下示例。

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"];

    

【讨论】:

以上是关于Httpclient multipart/form-data同时发布图片和json的主要内容,如果未能解决你的问题,请参考以下文章

Java使用HttpClient以multipart/form-data向接口上传文件

Httpclient multipart/form-data同时发布图片和json

.NET Core Web API使用HttpClient提交文件的二进制流(multipart/form-data内容类型)

Java 9 HttpClient 发送多部分/表单数据请求

如何使用HTTP POST multipart / form-data将文件上传到服务器?

springboot~feign模拟multipart/form-data