ASP.NET网络应用程序:如何使用WebApiHttpClient通过文件上载执行多部分发布

2uluyalo  于 2023-03-13  发布在  .NET
关注(0)|答案(3)|浏览(548)

我有一个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模拟相同的post,FormUrlEncodedContent位很简单,但是如何将具有该名称的文件内容添加到post?

0yg35tkg

0yg35tkg1#

经过大量的试验和错误,下面是实际工作的代码:

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;
    }
}
dpiehjr4

dpiehjr42#

谢谢@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);

给你以后参考。谢谢。

laximzn5

laximzn53#

您需要查找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);

相关问题