【问题标题】:Setting the ContentType header when sending MultipartFormDataContent using HttpClient使用 HttpClient 发送 MultipartFormDataContent 时设置 ContentType 标头
【发布时间】: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;
}

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api


    【解决方案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 中没有此功能,请参阅此处以获取替代方案stackoverflow.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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      相关资源
      最近更新 更多