摘要:大多数 Web 站点的用户界面都需要有图像,这些图像通常在磁盘上。本文介绍如何从程序集提供图像。从程序集提供图像可以避免众多文件散布在磁盘上,简化 Web 的安装和配置,以及提高图像的性。(本文包含一些指向英文站点的链接)
适用于:
Microsoft® .NET Framework 版本 1.0 和 1.1
Microsoft® Visual ®
Microsoft® ASP.NET
MFRImages.exe 示例文件。内容中包括 readme.htm,用于说明如何配置示例。
目录:
简介
问题概述
提供图像
从 ASPX 页面提供图像
从自定义处理程序提供图像
简介
经常会听到那些编写过 控件,后来又转向 Web 的程序员抱怨:“为什么不能像控件那样将图像在同一个程序集内呢?” 答案是可以,您只需要知道如何做到这一点。本文介绍如何从一个程序集内提供图像,并提供了两种检索图像的方法。本页顶端的 MFRImages.exe,以便完整地了解下面讨论的示例代码。
问题概述
Web 站点上的图像通常通过 URL 来引用,例如。它告诉 Web 客户端到哪里去查找图像。在 Web 页中,图像与文字是分别下载的。图像通常存储在 Web 中命名为 /images 等名称的子目录中,页面只是提供到这些图像的引用,以使它们能够显示在客户端的浏览器中。
当创建自定义控件时,情况也是如此 - 图像被用户下载之前通常需要存储在磁盘上。作为控件的编写者,您可能希望能够提供一个程序集,其中不仅包括控件,而且还包括相应的默认图像。控件保持独立完整很有益,因为它只需要用户进行较少的配置。(负责配置的用户可能会忘记将大量图像文件复制到生产服务器上,从而导致其他用户的不满。)
希望将资源绑定到程序集的另外一个原因可能是为了确保用户不能更改这些资源 - 例如对于公司商标,应始终使用特定的图像,而不能由某个用户将错误的图像(如不正确的字样或颜色)误保存到磁盘中。如果已对您的程序集进行了严格命名,当加载该程序集时,可以进行测试以确保该程序集未被篡改。
从程序集提供图像的主要问题是 HTTP 需要通过 URL 获得图像 - 您不能只将直接插入 HTML 的一串字节返回给用户,就期望能够正确显示图像。设法将图像请求重定向到程序集内的某个资源是很有必要的,在本文中我将介绍两种方法。
在继续下面的内容之前,还要注意一个问题。如果在 Web 服务器上没有进行其他一些配置,想提供一个能够正确呈现图像的完全独立控件是不可能的。您还需要在服务器上创建其他的文件(至少一个),或对 IIS 配置数据库做一些更改,以将图像提供给客户端。不过,完成这些简单的更改后,您就可以轻松地从任何程序集提供图像了。
提供图像
既然问题的关键是要提供图像,那么我们现在就进入正题。当从调用方传来信息后,我们需要找到一种方法来加载图像并在响应流中返回图像。请注意,此示例中提供的图像只有 .gif 一种类型 - 要提供其他类型的图像,则需要通过图像扩展名来推断内容类型和图像格式。
以下函数显示如何从给定的程序集加载图像,并通过 HttpResponse 流返回给客户端。我们将把此函数作为后面代码的基础,并在接下来的内容中添加更有用的功能,例如异常处理和图像缓存。我将把此函数定义为 ManifestImageLoader 类中的静态函数。
public class ManifestImageLoader { public static void RenderImage ( string assembly , string image , HttpContext context ) { Assembly resourceAssem = Assembly.Load ( assembly ) ; // 获取资源 using ( Stream imageStream = resourceAssem.GetManifestResourceStream ( image ) ) { // 如果可以,将其写出 using ( System.Drawing.Image theImage = System.Drawing.Image.FromStream ( imageStream ) ) response.ContentType = "image/gif" ; theImage.Save ( context.Response.OutputStream , ImageFormat.Gif ) ; } } } |
&