我在上传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);
}
}
答案 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);
}
}