如何解决未从.NET MVC MultipartFormDataContent POST接收到.NET Core API List <IFormFile>文件 编辑旧答案
我下面有一个.NET Core API POST方法:
public IActionResult UploadFiles([FromForm(Name = "files")] List<IFormFile> files,[FromForm(Name = "providerName")] string providerName)
{
try
{
return WriteToXlsx(files,providerName); //documents
}
catch (Exception ex)
{
return BadRequest($"Error: {ex.Message}");
}
}
从邮递员发帖时可以正常工作,可以接收文件。 但是,当尝试从ASP.NET MVC进行发布(如下所示)时,似乎没有收到文件。没有错误信息,但列表文件中的文件计数为零。正在接收字符串“ providerName”。
[HttpPost]
public async Task<ActionResult> ContentTransformation(IEnumerable<HttpPostedFileBase> files,string providerName)
{
try
{
HttpClientHandler clientHandler = new HttpClientHandler();
var httpClient = new HttpClient(clientHandler);
var multipartFormDataContent = new MultipartFormDataContent();
foreach (HttpPostedFileBase file in files)
{
byte[] fileData;
using (var reader = new BinaryReader(file.InputStream))
{
fileData = reader.ReadBytes(file.ContentLength);
}
var fileContent = new ByteArrayContent(fileData);
multipartFormDataContent.Add(fileContent,"files");
}
StringContent sProviderName = new StringContent(providerName);
multipartFormDataContent.Add(sProviderName,"\"providerName\"");
var response = await httpClient.PostAsync(ConfigurationManager.AppSettings["ContentTransformationAPI"],multipartFormDataContent);
FileContentResult metadataContent = new FileContentResult(response.Content.ReadAsByteArrayAsync().Result,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
return File(
fileContents: metadataContent.FileContents,contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",fileDownloadName: "metadata.xlsx"
);
}
catch (Exception ex)
{
ViewBag.Message = "File upload failed!! " + ex.Message;
ModelState.Clear();
return View();
}
}
解决方法
编辑
我发现了问题。您将放弃上载的FileName
,因此当您将数据从MVC控制器发布到API控制器时,它无法正确绑定。您需要更改的只是:
multipartFormDataContent.Add(fileContent,"files");
到
multipartFormDataContent.Add(fileContent,"files",file.FileName);
然后将文件正确绑定。
旧答案
您的代码(控制器+表单元素)为我工作,这使我认为这是您未正确设置的表单。最简单地,它应该看起来像这样:
@using (Html.BeginForm(
"ContentTransformation","YourControllerName",// Make sure you change this.
FormMethod.Post,new { enctype = "multipart/form-data" }))
{
<input type="file" name="files" multiple="multiple" />
<input type="submit" />
}
我认为您可能缺少的部分是new { enctype = "multipart/form-data" }
。 multipart/form-data
编码类型允许输入元素上传文件数据,因此没有它,上传器将无法工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。