C# 如何使用HttpClient发布表单数据文件?
我有后端端点C# 如何使用HttpClient发布表单数据文件?,c#,http,post,asp.net-core,multipartform-data,C#,Http,Post,Asp.net Core,Multipartform Data,我有后端端点Task Post(ifformfile csvFile),我需要从HttpClient调用这个端点。当前我收到不支持的媒体类型错误。 这是我的密码: var filePath = Path.Combine("IntegrationTests", "file.csv"); var gg = File.ReadAllBytes(filePath); var byteArrayContent = new ByteArrayContent(gg); var postResponse = a
Task Post(ifformfile csvFile)
,我需要从HttpClient调用这个端点。当前我收到不支持的媒体类型错误
。
这是我的密码:
var filePath = Path.Combine("IntegrationTests", "file.csv");
var gg = File.ReadAllBytes(filePath);
var byteArrayContent = new ByteArrayContent(gg);
var postResponse = await _client.PostAsync("offers", new MultipartFormDataContent
{
{byteArrayContent }
});
使用以下代码段:
const string url = "https://localhost:5001/api/Upload";
const string filePath = @"C:\Path\To\File.png";
using (var httpClient = new HttpClient())
{
using (var form = new MultipartFormDataContent())
{
using (var fs = File.OpenRead(filePath))
{
using (var streamContent = new StreamContent(fs))
{
using (var fileContent = new ByteArrayContent(await streamContent.ReadAsByteArrayAsync()))
{
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
// "file" parameter name should be the same as the server side input parameter name
form.Add(fileContent, "file", Path.GetFileName(filePath));
HttpResponseMessage response = await httpClient.PostAsync(url, form);
}
}
}
}
}
您需要在
MultipartFormDataContent
集合匹配操作参数名称(csvFile
)中指定参数名称和随机文件名
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(byteArrayContent, "csvFile", "filename");
var postResponse = await _client.PostAsync("offers", multipartContent);
或同等品
var postResponse = await _client.PostAsync("offers", new MultipartFormDataContent {
{ byteArrayContent, "csvFile", "filename" }
});
通过使用此代码解决:
const string fileName = "csvFile.csv";
var filePath = Path.Combine("IntegrationTests", fileName);
var bytes = File.ReadAllBytes(filePath);
var form = new MultipartFormDataContent();
var content = new StreamContent(new MemoryStream(bytes));
form.Add(content, "csvFile");
content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "csvFile",
FileName = fileName
};
content.Headers.Remove("Content-Type");
content.Headers.Add("Content-Type", "application/octet-stream; boundary=----WebKitFormBoundaryMRxYYlVt8KWT8TU3");
form.Add(content);
//Act
var postResponse = await _sellerClient.PostAsync("items/upload", form);
这对我来说是一个通用的
public static Task<HttpResponseMessage> PostFormDataAsync<T>(this HttpClient httpClient, string url, string token, T data)
{
var content = new MultipartFormDataContent();
foreach (var prop in data.GetType().GetProperties())
{
var value = prop.GetValue(data);
if (value is FormFile)
{
var file = value as FormFile;
content.Add(new StreamContent(file.OpenReadStream()), prop.Name, file.FileName);
content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = prop.Name, FileName = file.FileName };
}
else
{
content.Add(new StringContent(JsonConvert.SerializeObject(value)), prop.Name);
}
}
if (!string.IsNullOrWhiteSpace(token))
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
return httpClient.PostAsync(url, content);
}
公共静态任务PostFormDataAsync(此HttpClient HttpClient,字符串url,字符串令牌,T数据)
{
var content=新的MultipartFormDataContent();
foreach(data.GetType().GetProperties()中的var prop)
{
var值=prop.GetValue(数据);
if(值为FormFile)
{
var file=值为FormFile;
添加(新的StreamContent(file.OpenReadStream())、prop.Name、file.FileName);
content.Headers.ContentDisposition=newcontentDispositionHeaderValue(“表单数据”){Name=prop.Name,FileName=file.FileName};
}
其他的
{
Add(新的StringContent(JsonConvert.SerializeObject(value)),prop.Name);
}
}
如果(!string.IsNullOrWhiteSpace(标记))
httpClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,令牌);
返回httpClient.PostAsync(url、内容);
}
将附件作为一个MultipartFormDataContent发布
var type = typeof(Startup);
var stream = type.Assembly.GetManifestResourceStream(type, "Resources.New.docx");
var fileContent = new StreamContent(stream);
var data = new MultipartFormDataContent
{
{ fileContent, "file", "New.docx" }
};
var response = await _client.PostAsync("upload", multipartContent);
来源:尝试从另一个StackOverflow问题中解决问题谢谢,但仍然会出现相同的错误。谢谢,我缺少以下标题:content.headers.ContentDisposition=new ContentDispositionHeaderValue(“表单数据”){Name=“csvFile”,FileName=FileName};content.Headers.Remove(“内容类型”);Add(“内容类型”,“应用程序/八位字节流;边界=----WebKitFormBoundaryMRxYYlVt8KWT8TU3”);如果我的类型不是
文件
,而是列表
,该怎么办?谢谢。你能写一个api控制器的例子吗?在fileContent.Headers.ContentType
和fileContent.Headers.ContentType=MediaTypeHeaderValue.Parse(“多部分/表单数据”)上,缺少带有json数据的文件所需的任何自定义模型代码>保存我的生命使用语句的3/5可以简化为一行var fileContent=new ByteArrayContent(wait File.readallbyteasync(filePath))代码>边界是什么=----WebKitFormBoundaryMRxYYlVt8KWT8TU3??