ASP.NET WebApi:如何使用 WebApi HttpClient 通过文件上传执行多部分发布
Posted
技术标签:
【中文标题】ASP.NET WebApi:如何使用 WebApi HttpClient 通过文件上传执行多部分发布【英文标题】:ASP.NET WebApi: how to perform a multipart post with file upload using WebApi HttpClient 【发布时间】:2012-05-07 13:36:21 【问题描述】:我有一个 WebApi 服务处理从简单表单上传的内容,例如:
<form action="/api/workitems" enctype="multipart/form-data" method="post">
<input type="hidden" name="type" value="ExtractText" />
<input type="file" name="FileForUpload" />
<input type="submit" value="Run test" />
</form>
但是,我不知道如何使用 HttpClient API 模拟相同的帖子。 FormUrlEncodedContent
位很简单,但是如何在帖子中添加带有名称的文件内容呢?
【问题讨论】:
您介意在 WebApi 端分享使用 MultipartFormDataContent 的代码吗? 在答案***.com/a/59308653/5333683中将参数作为multipear dotnet 3.0 发送示例 【参考方案1】:感谢@Michael Tepper 的回答。
我必须将附件发布到 MailGun(电子邮件提供商),并且我必须对其稍作修改,以便它接受我的附件。
var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName));
fileContent.Headers.ContentDisposition =
new ContentDispositionHeaderValue("form-data") //<- 'form-data' instead of 'attachment'
Name = "attachment", // <- included line...
FileName = "Foo.txt",
;
multipartFormDataContent.Add(fileContent);
此处以供将来参考。谢谢。
【讨论】:
【参考方案2】:经过多次试验和错误,下面是实际工作的代码:
using (var client = new HttpClient())
using (var content = new MultipartFormDataContent())
var values = new[]
new KeyValuePair<string, string>("Foo", "Bar"),
new KeyValuePair<string, string>("More", "Less"),
;
foreach (var keyValuePair in values)
content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key);
var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName));
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
FileName = "Foo.txt"
;
content.Add(fileContent);
var requestUri = "/api/action";
var result = client.PostAsync(requestUri, content).Result;
【讨论】:
对大文件使用 StreamContent: var fileContent = new StreamContent(File.OpenRead(fileName)); 哇——我遇到了一个完全不同的问题,但仍然需要发布内容。我能够进行修改以满足我的需要。非常感谢!! 奇怪的是这对我不起作用。我必须在内容名称周围添加引号,请参见:***.com/questions/15638622/… 仅供参考,System.Net.Mime.DispositionTypeNames 下有一个“附件”常量 我也必须在名称值周围添加引号:FileName = "\"TestImage.jpg\""。我在服务器上使用 ServiceStack 而不是 WebAPI 不确定这是否相关。【参考方案3】:你需要寻找HttpContent
的各种子类。
您创建了一个多格式的 http 内容并向其添加不同的部分。在您的情况下,您有一个字节数组内容和表单 url 编码 沿行:
HttpClient c = new HttpClient();
var fileContent = new ByteArrayContent(new byte[100]);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
FileName = "myFilename.txt"
;
var formData = new FormUrlEncodedContent(new[]
new KeyValuePair<string, string>("name", "ali"),
new KeyValuePair<string, string>("title", "ostad")
);
MultipartContent content = new MultipartContent();
content.Add(formData);
content.Add(fileContent);
c.PostAsync(myUrl, content);
【讨论】:
不幸的是,这不起作用,尽管ContentDisposition
标头似乎让我向前迈了一步。如果我按原样使用您的示例代码,我会收到 Unsupported Media Type
异常。但是,如果我用MultipartFormDataContent
替换MultipartContent
,异常就会消失。但是,在服务器上,隐藏字段的值丢失了。
@MichaelTeper 我没有测试过代码。我会稍微玩一下并更新帖子,但我的意思是向您展示您需要查找的内容的 sn-p,而不是工作代码。
我刚收到StatusCode: 415, ReasonPhrase: 'Unsupported Media Type'
以上是关于ASP.NET WebApi:如何使用 WebApi HttpClient 通过文件上传执行多部分发布的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET WebApi:如何使用 WebApi HttpClient 通过文件上传执行多部分发布
如何在我的 ASP.NET 核心 WebApi 项目中全局启用 CORS
选择 webApi 模板时如何将 ASP.Net 身份添加到 Asp.Net Core?