4

我有一个系统,您可以在其中查看照片作为记录的额外细节。假设这是一张员工猫的照片。
这些照片存储在我们的数据库中。

当前,当有人希望查看小猫时。我们像这样渲染一个img标签。

<a href="#" onclick="RenderTag('20');return false;">View Kitty</a>
<div id="imageDiv"></div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
function RenderTag(id){
    $('#imageDiv').html('<img src="http://localhost/GetKitty.aspx?ID=' + id + '" />');
}
</script>

GetKitty.aspx 像这样工作

protected void Page_Load(object sender, EventArgs e)
{
    Response.Clear();
    Response.AddHeader("Content-Disposition","attachment;FileName=kitty.bmp");
    Response.ContentType = "image/bmp";
    Response.Cache.SetLastModified(DateTime.Now);
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Bitmap kitty = GetKittyBitmap(Request.QueryString("ID"));
    kitty.Save(Response.OutputStream, kitty.RawFormat);
    Response.Flush();
    Response.Close();
    kitty.Dispose();
}

单击锚链接后,页面是这样的。
在此处输入图像描述

问题是,有时小猫不会出现在我们的移动设备上,我的用户会感到沮丧,并打电话给办公室的人用他们的手机给小猫拍照并将小猫照片通过电子邮件发送给他们。

对通过电子邮件发送小猫图片的需求如此之大,以至于他们现在要求将发送小猫图片的电子邮件功能内置到系统中。

如果小猫的该死图片一直按预期呈现,则可以避免构建该功能。

是否有更可靠的方法来显示存储在数据库中的图像?

4

3 回答 3

0

虽然我认为这种方法没有问题,但您应该将其实现为 HttpHandler(.ashx)

如果 Kitty 不必在整个页面生命周期之后运行一个 aspx 页面,它会更快地离开您的服务器。

由于您是通过网络发送此图片,因此请考虑使用 jpg 或 png 等压缩格式。位图很大。你越快把小猫送出去越好。

对您的应用程序进行负载测试,从多个客户端下载多次并保存文件。IIS 有时会遇到它可以处理的同时请求数的限制。

如果你有一个页面上有几个这样的小猫图像,那就是对 asp.net 的许多请求。在 asp.net 2.0 上,默认的线程数只有 25。

于 2012-08-17T18:37:15.220 回答
0

您可以尝试使用 jQuery .load 函数来提供错误处理功能(并可能重新开始获取图像),如this SO post所示。

于 2012-08-17T17:22:20.890 回答
0

好的,我发现了一种让小猫始终渲染的可靠方法!

看来,如果我添加Content-Length标题,它可以解决问题。

我是这样实现的。

using (MemoryStream inputMS = NewMemoryStream(kittyBytes))
using (Bitmap kittyBitmap = new Bitmap(inputMS))
{
    Response.Clear();
    Response.Cache.SetLastModified(DateTime.Now);
    Response.Cache.SetCacheability(HttpCacheability.NoCache);

    //Some logic goes here determining the image type of the kitty
    //We send low rez jpgs at certain times
    string kittyFileSuffix = ".bmp";
    string kittyContentType = "image/bmp";

    Response.AddHeader("Content-Disposition", "attachment;FileName=Kitty" + kittyFileType);
    Response.ContentType = kittyContentType;
    using (Image smallKitty = ResizeKitty(kittyBitmap))
    {
        long quality = 40;
        Imaging.EncoderParameters ep = new Imaging.EncoderParameters(1);
        ep.Param[0] = new Imaging.EncoderParameter(Imaging.Encoder.Quality, quality);
        using (MemoryStream outputMS = new MemoryStream())
        {
            smallKitty.Save(outputMS, GetImageCodecInfo(kittyContentType), ep);
            Response.AddHeader("Content-Length", outputMS.Length);
            outputMS.WriteTo(Response.OutputStream);
            Response.Flush();
            Response.Close():
        }
    }
}
于 2012-09-05T15:10:43.473 回答