Я загружаю несколько файлов асинхронно, используя ASP.NET Core. Как только пользователь нажимает кнопку обзора и выбирает несколько файлов, запрос отправляется на сервер. Они обрабатываются одновременно, поэтому отладка кажется очень странной.
Я хотел бы разрешить пользователю загружать несколько файлов одновременно, но обрабатывать их по порядку следующим образом:
Файл1: сохранение в файловой системе и сохранение информации о файле в базе данных.
Файл 2: Когда все из Файла1 полностью завершено, сохраните в файловую систему и сохраните информацию о файле в базе данных.
File3: Когда все из File2 полностью завершено, сохраните в файловую систему и сохраните информацию о файле в базе данных.
Проблема, с которой я сталкиваюсь, заключается в том, что информация базы данных File2 зависит от данных из File1, информация базы данных File3 зависит от данных из File2 ... Я хочу позвонить в базу данных, чтобы получить предыдущий файл, но я не может, потому что никогда не существует из-за того, как все обрабатывается.
Существует настройка для элемента управления загрузчиком, который я использую, который называется: SequentialUpload .
Похоже, этот параметр должен помочь именно с тем, что я хочу, основываясь на описании, но в отладчике он все еще выглядит странно, и я не могу обработать по порядку.
Когда вы включите свойство sequentialUpload, выбранные файлы будут
обрабатывать последовательно (один за другим) на сервере. Если файл
загружен успешно или не удалось, следующий файл будет загружен
автоматически в этой последовательной загрузке.
Ниже показано, как выглядит моя серверная функция, исключая сохранение информации в базе данных, поскольку это бизнес-логика:
// Upload method for chunk-upload and normal upload
public IActionResult Save(IList<IFormFile> UploadFiles)
{
long size = 0;
// for normal upload
try
{
foreach (var file in UploadFiles)
{
var filename = ContentDispositionHeaderValue
.Parse(file.ContentDisposition)
.FileName
.Trim('"');
filename = hostingEnv.WebRootPath + $@"\{filename}";
size += file.Length;
if (!System.IO.File.Exists(filename))
{
using (FileStream fs = System.IO.File.Create(filename))
{
file.CopyTo(fs);
fs.Flush();
}
// LOGIC TO RETRIEVE INFO ABOUT PREVIOUSLY STORED FILE FROM DB HERE
// LOGIC TO STORE INFO ABOUT CURRENT FILE TO DB HERE
}
}
}
catch (Exception e)
{
Response.Clear();
Response.StatusCode = 204;
Response.HttpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase = "File failed to upload";
Response.HttpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase = e.Message;
}
return Content("");
}
Было бы идеально, если бы File1 обрабатывался, тогда я в конечном итоге выполнял функцию успеха на клиенте, а затем запускался File2 и так далее ... Вместо этого я всегда оказывался в функции успеха после того, как вся обработка выполнена.