【问题标题】:Why shouldnt I use IFormFile for large uploads为什么我不应该使用 IFormFile 进行大型上传
【发布时间】:2018-12-12 15:18:36
【问题描述】:

使用 .net 核心 2.1

根据 Microsoft documentation ,IFormFile 应该用于处理上传的小文件,而 MultipartReader 应该用于处理较大的文件。很公平。

但是,他们也说

使用 IFormFile 技术上传的文件在处理之前会在内存或 Web 服务器的磁盘上缓冲。在 action 方法中,IFormFile 内容可作为流访问。

因此,如果将大文件发送到磁盘,并通过流读取,为什么我们不应该总是使用 IFormFile?如果更大的文件没有完全加载到 RAM 中,我不明白 MultipartReader 的原因。

谁能解释我在这里遗漏了什么?

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc


    【解决方案1】:

    IFormFile 设置使用缓冲方法,消耗磁盘空间或内存。

    如果文件上传的大小或频率过高,磁盘和内存都是可能承受压力的资源,导致磁盘空间不足内存不足问题 ,这可能会使您的网站崩溃。

    请参阅同一 page 上的注释。

    任何超过 64KB 的单个缓冲文件都将从 RAM 移动到服务器磁盘上的临时文件。文件上传使用的资源(磁盘、RAM)取决于并发文件上传的数量和大小。流媒体与性能无关,而与规模有关。如果您尝试缓冲过多的上传内容,您的网站会在内存或磁盘空间不足时崩溃。


    通过MultipartReader 的流式传输方法不会将完整文件加载到内存中,也不会占用任何磁盘空间。

    【讨论】:

    • 等等,所以 MultipartReader 没有从内存或磁盘完全加载文件?
    • 仍在同一页面上;它读取每个人MultipartSection,这使它成为流式传输。
    • 是的,它使它成为流式传输,但是如果您将其保存到磁盘(如示例中所示),为什么我不应该简单地使用 Iformfile,如果文件很大,它也会保存到磁盘?这不是我不明白的,你能解释一下区别吗?
    • 使用IFormFile,在执行ASP.NET MVC action method 之前,首先在网络服务器上将一个大文件存储到磁盘,最终可能会将此图像存储在其实际位置(网络存储或数据库等)。因此,一切都是为了尽可能少地使用网络服务器的资源。
    • @YahyaHussein 在issue #7937 on github 中说“是的,文件被标记为 DeleteOnClose 并在请求结束时关闭”。
    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 2010-12-01
    • 2013-06-02
    • 1970-01-01
    • 2010-12-22
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多