当前位置:  开发笔记 > 编程语言 > 正文

动态渲染asp:ASP.NET中BLOB条目的图像

如何解决《动态渲染asp:ASP.NET中BLOB条目的图像》经验,为你挑选了3个好方法。

我想要实现的是这个.我想让用户能够上传图像文件,将图像存储在SQL Server中的BLOB中,然后将此图像用作网站其他页面中的徽标.

我这样做是通过使用

   Response.Clear();
   Response.ContentType = "image/pjpeg";
   Response.BinaryWrite(imageConents);
   Response.End();

但要做到这一点,我在我想要显示图像的地方使用用户控件.我想尽可能使用asp:Image控件,甚至是纯旧的html图像控件.这可能吗?



1> Fredrik Kals..:

在Web项目中添加"Generic Handler",将其命名为Image.ashx.像这样实现它:

public class ImageHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        using(Image image = GetImage(context.Request.QueryString["ID"]))
        {    
            context.Response.ContentType = "image/jpeg";
            image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        }
    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }
}

现在只需实现GetImage方法来加载具有给定ID的图像,您就可以使用了

 

显示它.您可能还想考虑在处理程序中实现某种形式的缓存.请记住,如果要将图像格式更改为PNG,则需要使用中间MemoryStream(因为PNG需要保存可搜索流).



2> FlySwat..:

您可以将BASE64直接将图像内容编码到SRC属性中,但是,我相信只有Firefox会将其解析回图像.

我通常做的是创建一个非常轻量级的HTTPHandler来提供图像:

using System;
using System.Web;

namespace Example
{  
    public class GetImage : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            if (context.Request.QueryString("id") != null)
            {
                Blob = GetBlobFromDataBase(id);
                context.Response.Clear();
                context.Response.ContentType = "image/pjpeg";
                context.Response.BinaryWrite(Blob);
                context.Response.End();
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

您可以直接在img标签中引用它:


或者,您甚至可以创建一个服务器控件来为您执行此操作:

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Example.WebControl
{

    [ToolboxData("<{0}:DatabaseImage runat=server>")]
    public class DatabaseImage : Control
    {

        public int DatabaseId
        {
            get
            {
                if (ViewState["DatabaseId" + this.ID] == null)
                    return 0;
                else
                    return ViewState["DataBaseId"];
            }
            set
            {
                ViewState["DatabaseId" + this.ID] = value;
            }
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write("");
            base.RenderContents(output);
        }
    }
}

这可以用作



    
推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有