Request.Files в ASP.NET CORE
Я пытаюсь загрузить файлы с использованием ядра aspnet с помощью ajax-запроса.
В предыдущих версиях .net я использовал для этого использование
foreach (string fileName in Request.Files)
{
HttpPostedFileBase file = Request.Files[fileName];
//Save file content goes here
fName = file.FileName;
(...)
но теперь он показывает ошибку в файле request.files, как я могу заставить его работать? я искал и обнаружил, что httppostedfile был изменен на iformfile, но как обрабатывать файлы request.files?
Ответы
Ответ 1
Это рабочий код из недавнего проекта. Данные были перенесены из Request.Files в Request.Form.Files.
Если вам нужно преобразовать поток в байтовый массив - это единственная реализация, которая сработала для меня. Другие возвращают пустой массив.
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;
}
}
}
Ответ 2
Этот код работает на 100% для обоих файлов, загруженных с использованием обычной формы или 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;
}
Ответ 3
Как насчет этого слияния из двух хороших решений, которые я нашел:
var myBytes = await GetByteArrayFromImageAsync(Request.Form.Files[0]);
private async Task<byte[]> GetByteArrayFromImageAsync(IFormFile file)
{
using (var target = new MemoryStream())
{
await file.CopyToAsync(target);
return target.ToArray();
}
}