【问题标题】:HttpPostedFileBase to Image throws exceptionsHttpPostedFileBase 到 Image 抛出异常
【发布时间】:2017-06-06 16:27:04
【问题描述】:

我正在上传一个 ~10Mb 的大图片,我有以下代码:

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);
}

这些异常的原因可能是什么?请注意:对于小图像,一切都很好。

【问题讨论】:

  • 您的网络服务器对可以使用的内存量有限制。 (如果您有权访问应用程序池的高级设置,您可以找到数量)。现在请记住,Web 服务器上的文件是原始格式。控制台应用无法重现,因为它按需获取内存。

标签: c# asp.net-mvc image jquery-file-upload httppostedfilebase


【解决方案1】:

参考-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();
    }
}

或者你可以在你的 for 循环中使用 using 块-

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);
            //...
        }
    }
}

【讨论】:

  • 其实只上传了一张图片。我尝试使用块,它仍然抛出相同的异常。顺便说一下,图片是上传的,不是从磁盘打开的。
【解决方案2】:

我已经阅读了许多类似例外的答案,但没有一个可以应用于我的案例。图像本身没有损坏或位不正确。问题是我在32 bit mode 中调试。一旦我在VS2015 中更改了这个设置,它就像一个魅力。似乎Image.FromStream 需要大量RAM 才能获得大图像。

工具 -> 选项 -> 项目和解决方案 -> Web 项目 -> 使用 64位...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2018-10-18
    • 2011-02-25
    相关资源
    最近更新 更多