【问题标题】:ASP.NET WebApi: how to perform a multipart post with file upload using WebApi HttpClientASP.NET WebApi:如何使用 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 位很简单,但是如何在帖子中添加带有名称的文件内容呢?

【问题讨论】:

标签: c# asp.net asp.net-web-api dotnet-httpclient


【解决方案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));
    • 哇——我遇到了一个完全不同的问题,但仍然需要发布内容。我能够进行修改以满足我的需要。非常感谢!!
    • 奇怪的是这对我不起作用。我必须在内容名称周围添加引号,请参见:stackoverflow.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'
    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多