System.OutOfMemoryException:上传文件时出现异常

时间:2013-06-03 20:58:46

标签: asp.net asp.net-mvc file-upload

我在上传84MB的文件时遇到此错误(请参阅下面的错误)但是当我上传一个~60MB的文件时,它运行正常。这只发生在我们的32位2008 VM 4/4内存上。在我的R2 64位VM w / 8GB内存上,即使是130MB文件也能正常工作。

  

System.OutOfMemoryException:类型异常   抛出'System.OutOfMemoryException'。在   System.IO.BinaryReader.ReadBytes(Int32 count)at   CustWeb.Controllers.DownloadsController.Create(下载dl,   HttpPostedFileBase文件)中   c:\ ... \ CustWeb \ Controllers \ DownloadsController.cs:第72行

我在任务管理器中监视了内存,在整个上传过程中它永远不会超过74%。

这是4.5 .NET框架上的MVC 4应用程序。

我在处理上传文件时在web.config中有最大设置。

<httpRuntime requestValidationMode="4.5" targetFramework="4.5" maxRequestLength="2147483647" executionTimeout="84000" />

...

<security>
     <requestFiltering>
         <requestLimits maxAllowedContentLength="2147482624" />
     </requestFiltering> 
</security>

更新按要求添加代码:

    public ActionResult Create(Download dl, HttpPostedFileBase file)
    {
        try
        {
            using (var binaryReader = new BinaryReader(file.InputStream))
            {
                dl.FileBytes = binaryReader.ReadBytes(file.ContentLength);
            }
            dl.FileContentType = file.ContentType;
            dl.FileName = file.FileName;
            dl.Insert();
            Success("<strong>" + dl.Label + "</strong> created and uploaded successfully.");
            return RedirectToAction("Index");
        }
        catch (Exception ex)
        {
            SelectList list = new SelectList(new DownloadType().GetDownloadTypes(), "ID", "Name");
            ViewBag.DownloadTypeList = list;
            Error(ex.ToString());
            return View(dl);
        }
    }

2 个答案:

答案 0 :(得分:3)

默认情况下,ASP.NET允许60%的可用内存 - 请检查memoryLimit in processModel in machine.config。您可以将该值更改为80%,以便为ASP.NET提供更多空间,但不建议这样做。考虑其他选项,例如以块的形式上传文件等。

答案 1 :(得分:0)

我将它从stream更改为file.SaveAs,这可以防止内存错误。

    public ActionResult Create(Download dl, HttpPostedFileBase file)
    {
        try
        {
            string tempFile = Path.Combine(Server.MapPath("~/App_Data/"), string.Format("{0}_{1}",Guid.NewGuid().ToString(), Path.GetFileName(file.FileName)));
            file.SaveAs(tempFile);
            dl.FileBytes = System.IO.File.ReadAllBytes(tempFile);
            dl.FileContentType = file.ContentType;
            dl.FileName = file.FileName;
            dl.Insert();
            System.IO.File.Delete(tempFile);
            Success("<strong>" + dl.Label + "</strong> created and uploaded successfully.");
            return RedirectToAction("Index");
        }
        catch (Exception ex)
        {
            SelectList list = new SelectList(new DownloadType().GetDownloadTypes(), "ID", "Name");
            ViewBag.DownloadTypeList = list;
            Error(ex.ToString());
            return View(dl);
        }
    }