asp.net - iformfile - net core 2.1 upload file
Request.Files en ASP.NET CORE (2)
Estoy tratando de cargar archivos usando aspnet core usando una solicitud ajax. En versiones anteriores de .net solía manejar esto usando
foreach (string fileName in Request.Files)
{
HttpPostedFileBase file = Request.Files[fileName];
//Save file content goes here
fName = file.FileName;
(...)
pero ahora muestra un error en request.files ¿cómo puedo hacer que funcione? Busqué y encontré que httppostedfile ha sido cambiado a iformfile pero cómo manejar request.files?
Este código funciona al 100% para ambos archivos cargados con forma regular o ajax:
[HttpPost]
public async Task<IActionResult> Upload(IList<IFormFile> files)
{
foreach (IFormFile source in files)
{
string filename = ContentDispositionHeaderValue.Parse(source.ContentDisposition).FileName.Trim(''"'');
filename = this.EnsureCorrectFilename(filename);
using (FileStream output = System.IO.File.Create(this.GetPathAndFilename(filename)))
await source.CopyToAsync(output);
}
return this.RedirectToAction("Index");
}
private string EnsureCorrectFilename(string filename)
{
if (filename.Contains("//"))
filename = filename.Substring(filename.LastIndexOf("//") + 1);
return filename;
}
private string GetPathAndFilename(string filename)
{
return this.HostingEnvironment.WebRootPath + "//files//" + filename;
}
Este es el código de trabajo de un proyecto reciente. Los datos se han movido de Request.Files a Request.Form.Files . En caso de que necesite convertir una matriz de bytes a bytes, esta es la única implementación que funcionó para mí. Otros devolverían matriz vacía.
using System.IO;
var filePath = Path.GetTempFileName();
foreach (var formFile in Request.Form.Files)
{
if (formFile.Length > 0)
{
using (var inputStream = new FileStream(filePath, FileMode.Create))
{
// read file to stream
await formFile.CopyToAsync(inputStream);
// stream to byte array
byte[] array = new byte[inputStream.Length];
inputStream.Seek(0, SeekOrigin.Begin);
inputStream.Read(array, 0, array.Length);
// get file name
string fName = formFile.FileName;
}
}
}