提供图像
既然问题的关键是要提供图像,那么我们现在就进入正题。当从调用方传来信息后,我们需要找到一种方法来加载图像并在响应流中返回图像。请注意,此示例中提供的图像只有 .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 ) ; } } } | 函数 RenderImage 接受程序集名称、图像名称和响应流。有了有效的程序集名称和图像名称,加载图像并将其返回到输出流就轻而易举了。首先加载程序集,然后使用 Assembly.GetManifestResourceStream 函数返回已命名资源(在此实例中为图像)的数据流。您需要为 System.Reflection 和 System.IO 添加 using 子句,使其能够通过编译,并引用 System.Drawing 程序集。
有了图像数据流之后,可以使用 Image.FromStream() 方法从该字节流构造图像 - 请注意,我们使用的是 System.Drawing 中的图像类,而不是 System.Web.UI.WebControls 中具有类似名称的类,因为前者具有访问 Win32 图像函数的权限,而后者在 Web 控件中包含了 <img> 标记。
您或许不熟悉 C# using 语法,该语法在 Try/Finally 块中包含了代码,可以确保对括号中的项调用 Dispose。
现在我们可以从程序集提供图像了,首先需要能够为该图像创建 URL。第一种方法是使用 .ASPX 页面。
从 ASPX 页面提供图像
第一种提供图像的方法需要使用 .ASPX 页面,该页面通常要驻留在服务器上的某个位置。页面本身不包含内容 - 它的主要功能是从 URL 检索参数,并使用这些参数来检索图像。
例如,有一个名为 ImageFromASPX.aspx 的页面位于 Web 站点的根目录下。然后可以在 HTML 中使用以下 URL 编码语法来定义从此页面提供的所有图像。这里我们提供的是名为 winxp.gif 的标题图像。
<img src="/imagefromASPX.aspx?assem=ImageServer&image=winxp.gif" />
在 URL 中,我们定义了 ASPX 页面的路径,然后定义了两个参数,一个是程序集名称(在此实例中为 ImageServer),另一个是图像名称。这在安全性方面可能存在风险,因此在本文的后面我将介绍一种可用于此数据的加密方法。 在 ASPX 页面的代码中,可以写入以下内容:
private void Page_Load ( object sender, System.EventArgs e ) { // 检索参数 string assembly = Request.QueryString["assem"] ; string image = Request.QueryString["image"] ;
// 并加载图像 ManifestImageLoader.RenderImage ( assembly , image ) ; } | 代码所做的就是根据请求分析参数,然后调用我们前面编写的 RenderImage 函数。正如您看到的,这并不难实现。但它有一个缺点,即所有对图像的请求都需要通过同一个 URL。也就是说,每个自定义控件都必须知道 imageserver.aspx 文件的位置和名称,才能提供图像。如何避免这个限制是下一节的主题。
|
|