【问题标题】:How to send and receive multipart/form-data containing files in .NET Core?如何在 .NET Core 中发送和接收包含文件的 multipart/form-data?
【发布时间】:2021-12-14 17:43:11
【问题描述】:

使用 .NET Core 3.1,我有以下 Http 客户端,它构建了一个包含 multipart/form-data 主体的 HTTP POST:

public async Task SendRequest(string randomString, IFormFileCollection files) 
{
    var form = new MultipartFormDataContent();
    
    form.Add(new StringContent(randomString), "randomString");
    
    foreach (var file in files)
    {
        var stream = new MemoryStream();
        await file.CopyToAsync(stream, cancellationToken);
        form.Add(new StreamContent(stream), "files");
    }

    using var request = new HttpRequestMessage(HttpMethod.Post, $"api/endpoint")
    {
        Content = form
    };

    await _httpClient.SendAsync(request);
}

接收控制器如下所示:

[Consumes("multipart/form-data")]
[HttpPost]
public async Task ReceiveForm([FromForm] RequestModel request)
{
    //Do stuff
}

RequestModel 看起来像这样:

public class RequestModel 
{
    [JsonPropertyName("randomString")]
    public string RandomString { get; set; }

    [JsonPropertyName("files")]
    public IFormFileCollection Files { get; set; }
}

我看到的问题是 requestModel.RandomString 被填充,但 requestModel.Files 没有 - 它为空。 我做错了什么?

【问题讨论】:

    标签: asp.net-core http .net-core asp.net-core-webapi


    【解决方案1】:

    感谢示例中的完美代码!

    您应该将两个参数(名称和文件名)设置为文件 - form.Add(new StreamContent(stream), "files", "files");

    方法说明:

    参数:
    content:要添加到集合中的 HTTP 内容。
    name:要添加的 HTTP 内容的名称。
    fileName:要添加到集合中的 HTTP 内容的文件名。

    这是我的例子:

    var fileName = "files";
    var byteArrayContent = new ByteArrayContent(fileBytes1);
    form.Add(byteArrayContent, fileName, fileName);
    
    var stream = new MemoryStream(fileBytes2);
    form.Add(new StreamContent(stream), fileName, fileName);
    

    结果:

    【讨论】:

    • 添加文件名有效!谢谢!
    • 没问题 :) 也谢谢你的好例子
    猜你喜欢
    • 2020-05-18
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2020-05-30
    相关资源
    最近更新 更多