使用 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 标头的主要内容,如果未能解决你的问题,请参考以下文章