Ich arbeite kürzlich an einer ReactJS-App, die eine API aufruft (entwickelt mit .NET Core 2.0).
Meine Frage ist, wie man HttpPostedFileBase
in einer .NET Core 2.0-API verwendet, um Dateiinhalte abzurufen und in der Datenbank zu speichern.
Sie haben HttpPostedFileBase
in ASP.NET Core 2.0 nicht, aber Sie können IFormFile
verwenden.
[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});
}
Mehr hier: https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.1
IFormFile
befindet sich im folgenden Namespace Microsoft.AspNetCore.Http
.
HttpPostedFileBase
existiert in ASP.NET Core nicht. Sie sollten stattdessen jetzt IFormFile
verwenden. Dies funktioniert jedoch nur, wenn Sie die Anforderung als multipart/form-data
Senden. Dies ist wahrscheinlich nicht der Fall, wenn Sie mit einem clientseitigen Framework wie React arbeiten. Wenn Sie JSON veröffentlichen, sollten Sie das JSON-Mitglied, das Ihrer Dateieigenschaft entspricht, mit der als Base64-Zeichenfolge codierten Datei festlegen. Serverseitig sollten Sie dann an byte[]
Binden.
Wenn jemand dies findet, indem er nach HttpPostedFileBase
sucht, sind Sie möglicherweise mit dem Schreiben von ASP.NET-Controller-Methoden wie folgt vertraut:
public async Task<IActionResult> DoThing(MyViewModel model, HttpPostedFileBase fileOne, HttpPostedFileBase fileTwo)
{
//process files here
}
Wenn Sie ein Äquivalent in ASP.NET Core schreiben möchten, können Sie es folgendermaßen schreiben:
public async Task<IActionResult> DoThing(MyViewModel model, IFormFile fileOne, IFormFile fileTwo)
{
//process files here
}
d.h. die einzige Änderung, die an der Methodensignatur erforderlich ist, besteht darin, HttpPostedFileBase
durch IFormFile
zu ersetzen. Sie müssen dann Ihre Methode ändern, um mit dem neuen Parametertyp zu arbeiten (z. B. HttpPostedFileBase
hat eine InputStream
-Eigenschaft, während IFormFile
eine OpenReadStream()
-Methode hat ), aber ich denke, die Details dieser Unterschiede gehen über den Rahmen dieser Frage hinaus.