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

我已经通过使用

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

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

===============>>#1 票数:18 已采纳

在您的Web项目中添加一个“通用处理程序”,将其命名为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加载图像,就可以使用

<asp:Image runat="server" ImageUrl="~/Image.ashx?ID=myImageId" /> 

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

===============>>#2 票数:9

您可以将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标签中直接引用它:

<img src="GetImage.ashx?id=111"/>

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

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

namespace Example.WebControl
{

    [ToolboxData("<{0}:DatabaseImage runat=server></{0}:DatabaseImage>")]
    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("<img src='getImage.ashx?id=" + this.DatabaseId + "'/>");
            base.RenderContents(output);
        }
    }
}

这可以像

<cc:DatabaseImage id="db1" DatabaseId="123" runat="server/>

当然,您可以根据需要在代码背后设置databaseId。

===============>>#3 票数:5

您不希望在不实施客户端缓存的情况下从数据库提供Blob。

您将需要处理以下标头以支持客户端缓存:

  • 标签
  • 过期
  • 上一次更改
  • 如果匹配
  • 如果不匹配
  • 如果自修改
  • 如果未修改,自
  • 除非修改自

有关执行此操作的http处理程序,请查看: http : //code.google.com/p/talifun-web/wiki/StaticFileHandler

它有一个很好的助手来提供内容。 将数据库流传递给它应该很容易。 它还进行服务器端缓存,这应有助于减轻数据库的压力。

如果您决定提供来自数据库,pdf或大文件的流内容,则该处理程序还支持206个部分请求。

它还支持gzip和deflate压缩。

这些文件类型将从进一步压缩中受益:

  • css,js,htm,html,swf,xml,xslt,txt
  • doc,xls,ppt

有些文件类型无法从进一步压缩中受益:

  • pdf(导致IE中某些版本出现问题,通常压缩得很好)
  • png,jpg,jpeg,gif,ico
  • WAV,MP3,M4A,AAC(WAV通常被压缩)
  • 3gp,3g2,asf,avi,dv,flv,mov,mp4,mpg,mpeg,wmv
  • zip,rar,7z,arj

===============>>#4 票数:2

结合使用ASP.Net和MVC,这非常容易。 您可以使用以下方法对控制器进行编码:

public FileContentResult Image(int id)
{
    //Get data from database. The Image BLOB is return like byte[]
    SomeLogic ItemsDB= new SomeLogic("[ImageId]=" + id.ToString());
    FileContentResult MyImage = null;
    if (ItemsDB.Count > 0)
    {
        MyImage= new FileContentResult(ItemsDB.Image, "image/jpg");
    }

    return MyImage;
}

在ASP.NET Web视图或本示例中,在ASP.NET Web窗体中,可以使用方法的URL填充图像控件,如下所示:

            this.imgExample.ImageUrl = "~/Items/Image/" + MyItem.Id.ToString();
            this.imgExample.Height = new Unit(120);
            this.imgExample.Width = new Unit(120);

Voilá。 不需要HttpModules麻烦。

===============>>#5 票数:0

实际上,我们刚刚发布了一些类来帮助解决此类问题:

http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

具体来说,请检查DatabaseImage示例。

===============>>#6 票数:0

将代码添加到处理程序中,以返回具有适当mime类型的图像字节。 然后,您可以将网址添加到您的处理程序中,就像它是图像一样。 例如:

<img src="myhandler.ashx?imageid=5">  

说得通?

  ask by Nikos Steiakakis translate from so

未解决问题?本站智能推荐:

3回复

在asp.net MVC中渲染图像

我的情况是这样的: 我基于返回三列的存储过程创建了自定义报告(person_id [long],name [varchar(100)],age [int],photo [image])。 这些是我的数据库表中的列和类型。 现在,我正在为报告的每个图像使用类似的东西。 与Sh
1回复

将Blob作为ASP.NET MVC中的文件下载

我将文件保存为MySQL数据库为blob。 能帮帮我吗,我该怎么下载这个blob作为文件? 我在数据库中有blob数据和ContentType 。 你可以在下面看到我的下载方法。 我已经搜索了一个多星期,但我无法做到。 我也不知道我可以直接通过方法下载或者我需要编写ajax。 我非常
2回复

在asp.net网页中动态显示图像

我想在以asp.net(网络形式)开发的网站中动态显示图像。 就像我在“管理”部分中创建了一个页面一样,在该页面中我将图像和上载的图像上载到文件夹中,并将其路径保存在数据库中。 现在,我已完成图像的上传和编辑。 我要显示在我要连续显示4张图像的页面中。 那么我需要使用什么控件。 或者还
2回复

如何在asp.net中动态显示图像

我有一个包含图像数量的文件夹。 最初必须从页面中的该文件夹加载第一张图像。 当用户单击第一张图片时,它应显示第二张图片,在该图片中将显示第三张图片的下一个链接。 当用户现在单击下一个链接时,它将显示第三幅图像,在该图像中将显示第四幅图像的下一个链接,在第三幅图像的前一链接中,它将重复直到图
4回复

图像在asp.net中动态调整大小

为简单起见,我可以说我有一个需要显示图像缩略图的网页。 图像位置存储在数据库中(图像存储在Amazon S3上)。 在将大型图像传送到客户端之前,是否可以让我的Web服务器缩小? 这样我就不必存储每个图像的缩略图,客户端可以下载较小的文件。
2回复

在ASP.NET中基于计数动态添加图像

假设我有5个复选框。 根据选中的复选框的数量,我必须添加图像和超链接到图像。 (即如果我已选中2复选框,则必须仅加载2个图像并链接到这2个加载的图像,如果选中3个复选框,则需要加载3个图像并链接到这3个加载的图像)。 有没有办法在asp.net中使用c#做到这一点?
1回复

使用asp.net身份更新Azure Blob存储中的图像

我目前能够从我的Blob存储中上传并显示图片,但是如果用户想要更改它,我正在努力寻找一种“更新/替换”该图片的方法。 我对以下两种方法之一感到满意: 替换图片并保持相同的网址 上载新图像并在数据库中引用新URL 在控制器中,我正在对photoService使用依赖注入
1回复

在asp.net中显示来自二进制数据/ Blob的图像

我设法使用imagehandler从数据库中检索了我的图像,但是问题是,它仅使用第一个图像检索,而不是在不同的数据上显示不同的图像。 所以这是我的图像处理程序代码,我对此行有string volunteerNames = imageRequest.QueryString["Voluntee
1回复

使用ASP.NET中的File Uploader将图像上传到Azure Blob?

我需要允许用户指定需要上传到Azure DB的图像,而不是像所有教程那样对Image Path进行硬编码。 这是我到目前为止: 码: 然而,这似乎不起作用。 如何使用ASP.NET中的File Uploader将图像上传到azure?
1回复

ASP.NET Core从Azure和数据库中删除图像Blob

我有一个ASP.NET应用程序,可以成功将图像上传到azure容器。 我正在尝试创建一个函数,该函数删除Blob中的特定图像,并从数据库中删除该图像。 从数据库中删除它并不困难,但是尝试从azure中删除它会引发异常。 我已经在网上搜寻了答案,但是什么也没有! 有什么帮助! 下面是代码