使用 HttpClient 发送 MultipartFormDataContent 时设置 ContentType 标头

Posted

技术标签:

【中文标题】使用 HttpClient 发送 MultipartFormDataContent 时设置 ContentType 标头【英文标题】:Setting the ContentType header when sending MultipartFormDataContent using HttpClient 【发布时间】:2014-12-19 17:11:10 【问题描述】:

我正在使用 HttpClient 使用以下代码将文件上传到 WebAPI 资源。由于我使用的是 MultipartFormDataContent,因此请求消息内容类型设置为 multipart/form-data。在 WebAPI 中,我正在检查内容标头以仅允许文本/纯媒体类型。那么,如果我将 HttpClient 与 MultipartFormDataContent 一起使用,我应该在哪里设置文件类型的内容头。

try

    var content = new MultipartFormDataContent();

    string filePath = Server.MapPath("~/Content/" + "demo.txt");

    var filestream = new FileStream(filePath, FileMode.Open);

    var fileName = System.IO.Path.GetFileName(filePath);

    content.Add(new StreamContent(filestream), "file", fileName);

    var requestMessage = new HttpRequestMessage()
    
            Method = HttpMethod.Post,
            Content = content,
            RequestUri = new Uri("http://localhost:64289/api/uploads/"), 
        ;

    var client = new HttpClient();

    client.DefaultRequestHeaders.Add("Accept", "application/json");

    HttpResponseMessage response = await client.SendAsync(requestMessage);

    if (response.IsSuccessStatusCode)
    
                    /// 
    

catch (Exception e)

                throw;

【问题讨论】:

【参考方案1】:

您可以使用 StreamContent 对象的 Headers 属性设置 ContentType 属性,例如,在我的情况下,我正在上传图像并使用以下代码:

        StreamContent image = new StreamContent(fileStream);
        image.Headers.ContentType = new MediaTypeHeaderValue(MimeMapping.GetMimeMapping(imagePath));

【讨论】:

我对 MimeMapping 类感到困惑,它是从哪里来的? MediaTypeHeaderValue 将字符串作为参数 @reggaeguitar 是的,你是对的,它需要一个字符串。如果它不改变,您可以“硬编码”一个固定的内容类型。您经常需要根据文件名设置 MIME 类型。这就是 MimeMapping.GetMimeMapping 函数的作用。 docs.microsoft.com/en-us/dotnet/api/… dot net core 中没有此功能,请参阅此处以获取替代方案***.com/questions/34131326/…【参考方案2】:

您可以使用以下代码设置 ContentType:

            var formData = new MultipartFormDataContent();
           
            var bytes = await video.GetBytes();
           
            var streamContent = new StreamContent(new MemoryStream(bytes));
            streamContent.Headers.Add("Content-Type", video.ContentType);
            streamContent.Headers.Add("Content-Disposition", $"form-data; name=\"video.FileName\"; filename=\"video.FileName\"");
            
            formData.Add(streamContent, "file", $"video.FileName");
            
            var request = new HttpRequestMessage(HttpMethod.Post, $"api/client/uploadVideo?deviceOs=deviceOs")
            
                Content = formData,
            ;

            request.Headers.Add("accept", "application/json");
            
            var response = await httpClient.SendAsync(request);

【讨论】:

以上是关于使用 HttpClient 发送 MultipartFormDataContent 时设置 ContentType 标头的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient使用小结

HttpClient使用总结

JAVA通过HttpClient发送HTTP请求的方法

HttpClient使用详解

使用httpclient发送post请求与get请求

HttpClient 拒绝发送自签名客户端证书