Почему мне не следует использовать IFormFile для больших загрузок

Использование .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, если файлы большего размера не полностью загружаются в оперативную память.

Может ли кто-нибудь объяснить, что мне здесь не хватает?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
0
3 585
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

подождите, значит, MultipartReader не загружает полностью файл из памяти или с диска?

user1861857 16.12.2018 16:24

Все еще на той же странице; он читает для каждого отдельного MultipartSection, что делает его потоковым.

pfx 16.12.2018 16:31

Да, он выполняет потоковую передачу, но если вы все равно сохраните его на диск (как показано в примере), почему бы мне просто не использовать Iformfile, который также сохраняет на диск, если файл большой? Это не то, чего я не понимаю, вы можете объяснить разницу?

user1185417 18.12.2018 22:25

С IFormFile большой файл сначала сохраняется на диск на веб-сервере, прежде чем ASP.NET MVC action method запускается, который, в конце концов, может сохранить этот образ в его фактическом местоположении (сетевое хранилище или база данных и т. д.). Так что все дело в использовании как можно меньше ресурсов веб-сервера.

pfx 18.12.2018 22:32

@pfx Как вы получаете MIME-тип при потоковой передаче? Mime-тип показывает "составные данные", когда это должен быть тип файла MIME.

Jack 29.07.2019 11:27

@pfx Спасибо, временные файлы будут автоматически удалены в какой-то момент? какая стратегия здесь используется?

Yahya Hussein 02.07.2020 12:53

@YahyaHussein выпуск # 7937 на гитхабе говорит "Да, файл помечается как DeleteOnClose и закрывается в конце запроса".

pfx 02.07.2020 18:08

Другие вопросы по теме