Асинхронная загрузка файлов в ASP.NET Core - PullRequest
0 голосов
/ 26 января 2019

Я загружаю несколько файлов асинхронно, используя 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 и так далее ... Вместо этого я всегда оказывался в функции успеха после того, как вся обработка выполнена.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

При использовании API последовательной загрузки выбранные файлы будут отправляться на сервер один за другим. После того, как первый файл обработан, может ли он быть успешным или неудачным, второй начинает загружаться. Вы можете проверить это в этом образце .

Также убедитесь, что вы используете пакеты Syncfusion ej2 версии 16.4.40 или выше. Если вы все еще сталкиваетесь с той же проблемой, пожалуйста, верните образец или код, достаточный для повторения проблемы. Это поможет обеспечить решение.

0 голосов
/ 26 января 2019

Похоже, что вы отправляете все файлы за один запрос, поэтому вы получите только один возврат.

Если я правильно понял, вам нужно отправить файл для каждого запроса, чтобы у вас был успешный вызов для каждого файла, тогда вы сможете синхронизировать kick для файла в каскаде, используя обратные вызовы.

...