使用 HttpClient 将文件上传到 ASP.NET WebApi 2

Upload Files with HttpClient to ASP.NET WebApi 2

我有这个 HttpClient 用于发布文件:

var content = new MultipartFormDataContent(Guid.NewGuid().ToString())
{
    new StringContent(JsonConvert.SerializeObject(parameters), Encoding.UTF8, "application/json")
};

foreach (var file in files)
{
    var byteContent = new ByteArrayContent(file.Data);

    content.Add(byteContent, file.FieldName, file.FileName);
}

return await _client.PostAsync(_apiUrl + apiRelativeUrl, content);

但我的 ASP.NET WebApi Controller 给出了错误 500,但出现以下异常:

System.IO.IOException: Unexpected end of MIME multipart stream. MIME multipart message is not complete.

WebApi控制器代码为

if (Request.Content.IsMimeMultipartContent())
{
    var multipart = await Request.Content.ReadAsMultipartAsync(); //this line throws the exception
    var fileContent = multipart.Contents.FirstOrDefault();

    if (fileContent != null)
    {
        var photo = await fileContent.ReadAsByteArrayAsync();
    }
}

我做错了什么?

尝试添加 header 您上传的文件类型:

 byteContent.Headers.ContentType =
            MediaTypeHeaderValue.Parse("image/jpeg");

这对我来说很好。

基本上我使用自定义流来附加 asp.net web api 期望的换行符。

Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
MemoryStream tempStream = new MemoryStream();
reqStream.CopyTo(tempStream);



tempStream.Seek(0, SeekOrigin.End);
StreamWriter writer = new StreamWriter(tempStream);
writer.WriteLine();
writer.Flush();
tempStream.Position = 0;


 StreamContent streamContent = new StreamContent(tempStream);
 foreach(var header in Request.Content.Headers)
 {
     streamContent.Headers.Add(header.Key, header.Value);
 }

// Read the form data and return an async task.
 await streamContent.ReadAsMultipartAsync(provider);

并在web.config

中添加以下代码
<system.web>
    <httpRuntime maxRequestLength="30000000" />
</system.web>

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="30000000" />
      </requestFiltering>
    </security>
</system.webServer>

希望对您有所帮助。

我创建了两个新的空项目,一个用于 webapi,一个用于 httpclient。

我尝试将现有的客户端代码和现有的服务器代码复制到新项目中。

我发现问题出在webapi action的参数上,好像断流了。

因此,如果有人需要将多部分表单数据上传到 ASP.NET WebApi 不要在操作中使用参数,它不会解析任何模型并且会破坏多部分流。