Использование .net core 2.1
Согласно Microsoft документация, IFormFile следует использовать для работы с небольшими загруженными файлами, тогда как MultipartReader следует использовать для больших файлов. Справедливо.
Однако они также говорят
Files uploaded using the IFormFile technique are buffered in memory or on disk on the web server before being processed. Inside the action method, the IFormFile contents are accessible as a stream.
Итак, если большие файлы отправляются на диск и читаются в потоке, почему бы нам не всегда использовать IFormFile? Я не понимаю, почему MultipartReader, если файлы большего размера не полностью загружаются в оперативную память.
Может ли кто-нибудь объяснить, что мне здесь не хватает?
В установке IFormFile
используется метод буферизации, занимающий либо дисковое пространство, либо память.
И диск, и память - это ресурсы, которые могут оказаться под давлением, если размер или частота загрузки файлов слишком высоки, что вызывает не хватает места на диске или проблемы с памятью, что может привести к сбою вашего сайта.
См. Примечание к тому же страница.
Any single buffered file exceeding 64KB will be moved from RAM to a temp file on disk on the server. The resources (disk, RAM) used by file uploads depend on the number and size of concurrent file uploads. Streaming isn't so much about perf, it's about scale. If you try to buffer too many uploads, your site will crash when it runs out of memory or disk space.
Потоковый подход через MultipartReader
не загружает весь файл в память и не занимает места на диске.
Все еще на той же странице; он читает для каждого отдельного MultipartSection
, что делает его потоковым.
Да, он выполняет потоковую передачу, но если вы все равно сохраните его на диск (как показано в примере), почему бы мне просто не использовать Iformfile, который также сохраняет на диск, если файл большой? Это не то, чего я не понимаю, вы можете объяснить разницу?
С IFormFile
большой файл сначала сохраняется на диск на веб-сервере, прежде чем ASP.NET MVC action method
запускается, который, в конце концов, может сохранить этот образ в его фактическом местоположении (сетевое хранилище или база данных и т. д.). Так что все дело в использовании как можно меньше ресурсов веб-сервера.
@pfx Как вы получаете MIME-тип при потоковой передаче? Mime-тип показывает "составные данные", когда это должен быть тип файла MIME.
@pfx Спасибо, временные файлы будут автоматически удалены в какой-то момент? какая стратегия здесь используется?
@YahyaHussein выпуск # 7937 на гитхабе говорит "Да, файл помечается как DeleteOnClose и закрывается в конце запроса".
подождите, значит, MultipartReader не загружает полностью файл из памяти или с диска?