2017-06-06 73 views
0

我上傳一個大圖像〜10Mb的,我有以下代碼:HttpPostedFileBase到圖像拋出異常

public ActionResult Upload(IEnumerable<HttpPostedFileBase> files) 
{ 
    foreach (var file in files) 
    { 
     var image = Image.FromStream(file.InputStream, true, true); 
     ... 
    } 
} 

有時它拋出Out of Memory,有時GDI+ generic errors。我不能在一個控制檯應用程序用下面的代碼重現此:

using (FileStream stream = File.Open(@"d:\test.jpg", FileMode.Open)) 
{ 
    var image = Image.FromStream(stream); 
} 

什麼可以爲那些異常的原因是什麼?一個注意事項:對於小圖像,一切都很好。

+0

你的Web服務器有多少內存如何使用的限制。 (如果您有權訪問應用程序池的高級設置,您可以找到多少個)。現在請記住,Web服務器上的文件位於原始表單上。控制檯應用程序無法重現,因爲它按需獲取內存。 –

回答

0

我已閱讀答案中的使用適用於我的情況。圖像本身沒有被破壞或不正確的位。事情是我在32 bit mode調試。只要我在VS2015中更改此設置,它就像魅力一樣工作。似乎Image.FromStream需要很多RAM的大圖像。

工具 - >選項 - >項目和解決方案 - > Web項目 - >使用 64位...

0

Refer- out of memory Image.FromFile

我認爲你是不能夠重現這在控制檯應用程序的原因是因爲使用的是一次性的代碼塊(使用塊)。

試着改變你的代碼像這個 -

public ActionResult Upload(IEnumerable<HttpPostedFileBase> files) 
{ 
    foreach (var file in files) 
    { 
     fs = new FileStream(image_url, FileMode.Open, FileAccess.Read);  
     img = Image.FromStream(fs); 
     var image = Image.FromStream(fs); 
     ... 

     //after you are done call below line 
     fs.Close(); 
    } 
} 

,也可以使用塊上很多類似的異常,沒有人能爲你 - 環

public ActionResult Upload(IEnumerable<HttpPostedFileBase> files) 
{ 
    foreach (var file in files) 
    { 
     using (FileStream stream = File.Open(<give_file_URL_here>, FileMode.Open)) 
     { 
      var image = Image.FromStream(stream); 
      //... 
     } 
    } 
} 
+0

其實只上傳了一張圖片。我嘗試使用塊,它仍然拋出相同的例外。順便說一下,圖像上傳,而不是從磁盤打開。 –