Недавно я работал над приложением ReactJS, которое вызывает API (разработанное с помощью .NET Core 2.0).
У меня вопрос, как использовать HttpPostedFileBase
в API .NET Core 2.0, чтобы получить содержимое файла и сохранить его в базе данных.
У вас нет HttpPostedFileBase
в ASP.NET Core 2.0, но вы можете использовать IFormFile
.
[HttpPost("UploadFiles")]
public async Task<IActionResult> Post(List<IFormFile> files)
{
long size = files.Sum(f => f.Length);
// full path to file in temp location
var filePath = Path.GetTempFileName();
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
}
}
// process uploaded files
// Don't rely on or trust the FileName property without validation.
return Ok(new { count = files.Count, size, filePath});
}
Подробнее здесь: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.1
IFormFile
находится в следующем пространстве имен Microsoft.AspNetCore.Http
.
HttpPostedFileBase
не существует в ASP.NET Core. Вместо этого вам следует использовать IFormFile
. Однако это работает только тогда, когда вы отправляете запрос как multipart/form-data
, чего вы, вероятно, не делаете, если работаете с клиентской структурой, такой как React. Если вы публикуете JSON, вы должны установить член JSON, который соответствует свойству вашего файла, с файлом, закодированным как строка Base64. На стороне сервера вам следует выполнить привязку к byte[]
.
Вы также должны получить такие файлы:
[HttpPost]
public ActionResult UploadFiles()
{
var files = Request.Form.Files;
return Ok();
}
Если кто-то найдет это, выполнив поиск HttpPostedFileBase
, возможно, вы знакомы с написанием методов контроллера ASP.NET примерно так:
public async Task<IActionResult> DoThing(MyViewModel model, HttpPostedFileBase fileOne, HttpPostedFileBase fileTwo)
{
//process files here
}
Если вы хотите написать эквивалент в ASP.NET Core, вы можете написать его так:
public async Task<IActionResult> DoThing(MyViewModel model, IFormFile fileOne, IFormFile fileTwo)
{
//process files here
}
то есть единственное изменение, необходимое для сигнатуры метода, - это замена HttpPostedFileBase
на IFormFile
. Затем вам нужно будет изменить свой метод для работы с новым типом параметра (например, HttpPostedFileBase
имеет свойство InputStream
, тогда как IFormFile
имеет метод OpenReadStream()
), но я думаю, что детали этих различий выходят за рамки этого вопроса.
Возможный дубликат MVC 6 HttpPostedFileBase?