上传文件而不加载到asp.net mvc中的ram

时间:2009-11-24 01:35:31

标签: asp.net-mvc file upload

我注意到之前没有问过这个问题所以我想问这个问题......

目前正在编写一个上传控制器来上传一些相当大的文件。但我注意到当它上传大文件时,CPU和RAM达到峰值,这真的不是我想要的(当然你也是)

我的控制器看起来像:

int Count = 0;
        string _uploadsFolder = HostingEnvironment.MapPath("~/Upload/Files/Images/");

        for (int i = 0; i < Request.Files.Count; i++)
        {
            HttpPostedFileBase _file = Request.Files[i];

            // Validation ......
            FileMIME mimetype = new FileMIME();
            mimetype.AllowedMimeTypes.Add("image/png");
            mimetype.AllowedMimeTypes.Add("image/jpeg");
            mimetype.AllowedMimeTypes.Add("image/gif");

            if ((_file.ContentLength > 0) && (_file.ContentLength < 4194304) && (mimetype.IsImage(_file)))
            {
                string guid = Guid.NewGuid().ToString();
                string _fileLocation = Path.Combine(_uploadsFolder, Path.GetFileName(_file.FileName));

                _file.SaveAs(_fileLocation);

                Count++;
            }
        }

有没有把这个缓冲区变成硬盘而不是ram?

非常感谢你......

2 个答案:

答案 0 :(得分:0)

我不确定,但如果不使用CPU和RAM,它将如何进入硬盘?似乎服务器需要通过RAM处理流,以便将其写入硬盘驱动器。

答案 1 :(得分:0)

如果这是来自网页然后从客户端计算机到服务器,则需要将流加载到内存中。我认为没有办法解决这个问题。

可能有办法减轻服务器上的负载。您可以将其设置为异步,让用户可以相对自由地继续。

您可以以块的形式处理数据流,而不是一次性处理。

可能还有其他人,但所有这些仍然会使用ram。

看起来您可能正在接受图片。您可以在保存到数据库之前在内存中调整图像大小,这样一旦您拥有该文件,这将减少RAM上的任何未来负载,但是再次,这会在您上传文件时使用RAM。

(唯一的)另一种方式,也就是非常奇怪的方式,可能是允许用户将文件ftp到您的站点,然后使用表中的条目引用该文件。

您甚至可以通过您的网络应用程序执行此操作,但我从未尝试过。