Загрузка средних и больших файлов с обновлениями хода выполнения в AspNet Core

Под средним и большим я имею в виду что-то от 10 МБ до 200 МБ (звуковые файлы, если это важно)

в основном я хочу сделать API, который выполняет спектральный анализ самого файла, для этого потребуется загрузка файла. Но по причинам UI/UX было бы неплохо иметь индикатор выполнения для процесса загрузки. Каковы общие архитектуры для достижения этого взаимодействия.

Клиентское приложение, загружающее файл, будет клиентом javascript (reactjs/redux), а API написан на ASP.NET Core. Я видел несколько примеров, которые используют веб-сокеты для обновления клиента в процессе выполнения, и другие примеры, когда клиент опрашивает обновления статуса с учетом URL-адреса ресурса для запроса статуса. Существуют ли какие-либо передовые методы (или «современный способ сделать это») для выполнения такой вещи, о которой я должен знать? ТИА


person Lutando    schedule 31.10.2016    source источник
comment
Прогресс для загрузки или для спектрального анализа?   -  person Tseng    schedule 31.10.2016
comment
Для загрузки. Я уже написал PoC, который выполняет спектральный анализ и возвращает [0-100]% прогресса, это все на стороне сервера. Я просто не уверен в том, как выполнить загрузку. На самом деле это будет двухэтапный индикатор выполнения (фаза 1 — загрузка, фаза 2 — анализ), но я не уверен, как будет выполняться эта загрузка.   -  person Lutando    schedule 31.10.2016


Ответы (1)


В общем, вам просто нужно сохранить статус выполнения при чтении входного потока в вашем контроллере в какую-то переменную (переменную, специфичную для сеанса, потому что одновременно может быть несколько сеансов загрузки файлов), а затем получить этот статус от клиента. рядом с запросами ajax (или signalr).

Вы можете взглянуть на этот пример: https://github.com/DmitrySikorsky/AspNetCoreUploadingProgress

Я пробовал файлы размером 11 МБ без проблем. есть линия

await Task.Delay(10); // It is only to make the process slower

там, не забудьте удалить его в реальном решении.

В этом примере файлы загружаются с помощью ajax, поэтому я не пробовал действительно большие файлы, но вы можете использовать решение iframe из этого примера: https://github.com/DmitrySikorsky/AspNetCoreFileUploading

Другая часть будет почти такой же.

Надеюсь, это поможет вам. Не стесняйтесь спрашивать, если у вас есть какие-либо дополнительные вопросы.

person Dmitry Sikorsky    schedule 01.02.2017
comment
Спасибо большое, сегодня обязательно посмотрю - person Lutando; 01.02.2017
comment
Большая проблема заключается в том, что о прогрессе сообщается на сервере и в одном действии контроллера. Это не дает возможности увидеть прогресс на клиенте там, где это необходимо. - person ProfK; 30.03.2018
comment
@ProfK ты смотрел демо? Чтобы показать прогресс на стороне клиента. Клиентская сторона запрашивает серверную часть, чтобы получить текущий прогресс. - person Dmitry Sikorsky; 01.04.2018