我关心这个重载中的第三个参数validateImageData.文档没有解释太多,只是说它导致图像数据被验证但没有细节,究竟是做了什么来验证图像数据?
public static Image FromStream ( Stream stream, bool useEmbeddedColorManagement, bool validateImageData )
我想在Web应用程序中使用它,所以,我想知道如果我将validateImageData设置为true将会发生什么,我想确保用户上传的是有效图像,是否建议将validateImageData设置为true或者是否足以在抛出异常时捕获异常?另外,将validateImageData设置为true可以以任何方式影响性能吗?(用户可以上传最大250k的图片)
谢谢
从Reflector,我们看到:
if (validateImageData) { num = SafeNativeMethods.Gdip.GdipImageForceValidation(new HandleRef(null, zero)); if (num != 0) { SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(null, zero)); throw SafeNativeMethods.Gdip.StatusException(num); } }
所以我们看到调用了GdipImageForceValidation(回想一下,System.Drawing只是GDI +的一个包装器).这个函数的文档不是很好:
此功能强制验证图像.
不是很有用.但是,重点是 - 询问图像文件以确保加载是安全的.这可能导致整个图像被加载到内存中.
如果您接受来自用户的输入,我当然会将此标志设置为true - 您永远不会知道用户将上传哪种文件(格式错误或其他).比抱歉更安全.这就是默认值为的原因true
.
另请注意,建议不要将GDI + 用于服务器环境.你最好不要使用System.Windows.Media.Imaging
.
通过仔细阅读内部反射器,您将看到默认情况下,.NET始终在名为GdipImageForceValidation的GDI +库中调用本机API(通过为validateImageData参数传递true).我找不到MSDN中的本机API,只有这个,它告诉我们的不过是函数本身的名称.但是,看起来这种方法会导致性能下降,这是基于Justin Roger关于通过.NET以最快的方式加载图像的帖子.期望任何"验证"步骤都会影响性能也是直观的.
但是,如果为validateImageData参数指定false,则.NET将显式触发非托管代码安全性 需求,这意味着框架作者决定强制进行图像验证是必要的,以便使托管代码的承诺安全,并最终能够相信调用者所说的数据代表一个图像.因此,虽然为validateImageData指定flase可能会提高性能,但在不完全信任的安全上下文中,它可能会生成异常,并且您最好信任您认为是图像的数据.