Je travaille récemment sur une application ReactJS qui appelle une API (développée avec .NET Core 2.0).
Ma question est de savoir comment utiliser HttpPostedFileBase
dans une API .NET Core 2.0 afin d'obtenir le contenu du fichier et de l'enregistrer dans la base de données.
Vous n'avez pas HttpPostedFileBase
dans ASP.NET Core 2.0, mais vous pouvez utiliser 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});
}
Plus ici: https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.1
IFormFile
est dans l'espace de noms suivant Microsoft.AspNetCore.Http
.
HttpPostedFileBase
n'existe pas dans ASP.NET Core. Vous devriez utiliser IFormFile
maintenant à la place. Cependant, cela ne fonctionne que lorsque vous envoyez la demande en tant que multipart/form-data
, ce que vous ne ferez probablement pas si vous travaillez avec un framework côté client comme React. Si vous publiez JSON, vous devez définir le membre JSON qui correspond à votre propriété de fichier avec le fichier codé en tant que chaîne Base64. Côté serveur, vous devez ensuite vous lier à byte[]
.
Si quelqu'un trouve cela en recherchant HttpPostedFileBase
c'est peut-être que vous êtes familier avec l'écriture de méthodes de contrôleur ASP.NET quelque chose comme ceci:
public async Task<IActionResult> DoThing(MyViewModel model, HttpPostedFileBase fileOne, HttpPostedFileBase fileTwo)
{
//process files here
}
Si vous souhaitez écrire un équivalent dans ASP.NET Core, vous pouvez l'écrire comme ceci:
public async Task<IActionResult> DoThing(MyViewModel model, IFormFile fileOne, IFormFile fileTwo)
{
//process files here
}
c'est-à-dire que le seul changement nécessaire à la signature de la méthode est de remplacer HttpPostedFileBase
par IFormFile
. Vous devrez ensuite modifier votre méthode pour travailler avec le nouveau type de paramètre (par exemple HttpPostedFileBase
a une propriété InputStream
, tandis que IFormFile
a une méthode OpenReadStream()
), mais je pense que les détails de ces différences dépassent le cadre de cette question.