【问题标题】:Intermittent generic error occurred in GDI+ when saving image保存图像时在 GDI+ 中发生间歇性一般错误
【发布时间】:2014-07-27 22:43:13
【问题描述】:

我在 ASP.NET 4.0 中构建了一个动态图像大小调整 Web 应用程序,它在使用 IIS 7.5 的 Windows 2008 R2 服务器上运行。

图像本身作为二进制最大字段存储在 SQL 2008 R2 数据库中(图像足够小,这是可行的,我们最初尝试了 filestream 选项,但对于我们的目的来说太慢了)

我查询数据库以检索“blob”作为字节数组并将其加载到图像对象中,如下所示:

Dim imageOriginal as Image = Nothing
Dim imageResized as Image = Nothing

imageOriginal = FindOriginalImage()

我需要对它做一些事情 - 如果它是 PNG,我必须在白色画布上绘制它,否则如果我需要调整图像大小,我会得到一些非常疯狂的条纹。我还可能将其缩小,可能会在其上添加水印,并在将其提供给最终用户之前将其保存到磁盘。为了完成所有这些,我发现我必须创建第二个图像对象,以便在将其保存到磁盘之前执行一些必要的任务,因此我将原始图像复制到调整大小的对象中进行处理。见下文:

If Not imageOriginal is nothing then
    imageResized = imageOriginal

(如果在数据库中未找到图像,则调用 FindOriginalImage 将返回 NOTHING 值)

....所有其余的调整大小、水印等 - 这段代码都可以工作...

在我对 imageResized 对象做完所有我需要做的事情之后,我运行这一行:

imageResized.Save(DestinationFile, ImageFormat.Jpeg)

大多数情况下,这都能顺利运行,但有时我在尝试将文件保存到磁盘时会遇到 GDI+ 通用错误。

当然,我也处理完这两个对象:

imageResized.Dispose()
imageOriginal.Dispose()
GC.Collect()

有什么想法吗?

【问题讨论】:

  • 如果您要覆盖源文件,您必须确保首先处理打开/锁定文件的对象。 Using 块会有所帮助
  • hmmm 很有趣 - 实际上有可能有多少请求进来,不止一个人可以触发“调整”图像大小的代码(这是一个自定义的 404 处理页面)。一旦以请求的大小创建图像,所有未来的用户都将直接使用它 - 因此除非删除调整大小的版本,否则代码不应再次运行。我将对此进行调查 - 鉴于这种情况很少发生,这可能是原因。

标签: asp.net vb.net


【解决方案1】:

一般来说,“GDI+ 通用错误”通常是由文件系统权限问题引起的。检查以确保运行应用程序池的上下文对您尝试保存的文件夹具有适当的“写入”权限。

【讨论】:

  • 为应用程序池使用的身份正确设置了权限,我们已经验证了这一点。它通常可以工作,但有时我们会遇到这样的奇怪故障——这可能是由文件系统过载引起的吗?很多人都在提出请求 - 每天超过 200,000 个,而我通常看到的请求不到 100 个。
【解决方案2】:

尝试先将图像保存到 MemoryStream,然后将内存流转储到文件系统 - 至少可以排除文件/访问问题。

【讨论】:

  • 我喜欢这个答案。如果我仍然看到它,我会尝试并告诉你。
  • 仍然看到错误,但至少我知道它现在确切发生在哪里。在过去的两个小时内发生了 3 次,它发生在我试图在磁盘上创建 .JPG 目标文件之前,然后再写出内存流。
猜你喜欢
  • 2013-09-26
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2019-01-02
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多