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?

如何从 ASP.NET Core WebAPI 获取 int 值?

asp.net 如何变成 MVC 或 WebApi?

如何在 Asp.net MVC 中添加 Web Api,然后在同一个应用程序中使用 WebAPI