Я прочитал ряд тесно связанных вопросов, но не тот, который точно соответствует этому. Если это дубликат, пожалуйста, пришлите мне ссылку.
Я использую угловую версию библиотеки flowjs для загрузки файлов HTML5 (https://github.com/flowjs/ng-flow). Это работает очень хорошо, и я могу загружать несколько файлов одновременно кусками по 1 МБ. Существует контроллер файлов веб-API ASP.Net, который принимает их и сохраняет на диске. Хотя я могу сделать эту работу, я не делаю это эффективно и хотел бы знать лучший подход.
Во-первых, я использовал MultipartFormDataStreamProvider в асинхронном методе, который отлично работал, пока файл загружался одним фрагментом. Затем я переключился на использование FileStream для записи файла на диск. Это также работало, пока куски поступали в порядке, но, конечно, я не могу на это полагаться.
Затем, просто чтобы увидеть, как это работает, я записал куски в отдельные файловые потоки и объединил их постфактум, отсюда и неэффективность. Файл размером 1 ГБ будет генерировать тысячу фрагментов, которые необходимо будет прочитать и перезаписать после завершения загрузки. Я мог бы хранить все фрагменты файлов в памяти и сбрасывать их после загрузки, но боюсь, что сервер взорвется.
Кажется, должно быть хорошее асинхронное решение этой дилеммы, но я не знаю, что это такое. Одной из возможностей может быть использование async
/await
для объединения предыдущих фрагментов при записи текущего фрагмента. Другим может быть использование Begin
/EndInvoke
для создания отдельного потока, чтобы манипуляции с файлами на диске обрабатывались независимо от чтения потока из HttpContext
, но это будет зависеть от ThreadPool
, и я боюсь, что созданные потоки будут необоснованно прекращены. когда мой контроллер MVC вернется. Я мог бы создать FileWatcher
, который работал бы полностью независимо от ASP.Net, но это было бы очень неуклюже.
Итак, мои вопросы: 1) есть ли уже простое решение, которое мне не хватает? (похоже, должно быть) и 2), если нет, то каков наилучший подход к решению этой проблемы в рамках веб-API?
Спасибо, Боб