从数据库加载大图像并将其返回到客户端

时间:2011-05-19 13:19:15

标签: asp.net image download

您好: 在我的应用程序中,我有一些图像保存在数据库中,所以我创建了一个ImgDownLoad.aspx来检索图像并重新调整它们,因为数据库中的图像可能非常大(其中一些超过20M),所以我生成一些缩略图,这是代码:

page_load(){
  string id=Requset.QueryString["id"];
  string imgtype=Requset.Querystring["itype"];

  if(imgType=="small")
  {
   //request the thumbnail
    string small_loaction=getSmallLocationById(id);

    if(!File.exists(small_location)
    {
      byte[] img_stream =getStreamFromDb(id);
      Image img=Image.frameStream(new MemsorStream(img_steam));//here,I often get the out of memory error,but I am not sure when it will happen.
      generateSmallImage(img,location)
    }
   Response.TransferFile(small_location);
  }

  else if(imgType=="large"){
    byte[] img_stream =getStreamFromDb(id);
    new MemorySteam(img_stream).writeTo(Response.outputstream);
  } 
}

有什么不对吗?

另外,由于我不知道图像格式,所以我无法添加

Response.contenttype="image/xxx";

让我最困惑的是我会遇到内存不足错误,所以我更改了代码:

try{
          byte[] img_stream =getStreamFromDb(id);
          Image img=Image.frameStream(new MemsorStream(img_steam));//here,I often get the out of memory error,but I am not sure when it will happen.
          generateSmallImage(img,location)
}
catche(exceptin e){
 //the small image can not generated,just return the whole image
  new MemorySteam(img_stream).writeTo(Response.outputstream);
  return;
}

在这种情况下,我会避免内存不足的问题,但有些大图像有时无法下载。

所以我想知道是否有办法处理大图像流?

拍摄大图像:

resolution:12590x4000
size:26M.

事实上,我用mspaint打开了一张大图像(差不多24M),然后再次保存图像,我发现它的尺寸比起初要小得多。那么可以在服务器端调整图像大小吗?还是其他好礼貌来解决我的问题?

1 个答案:

答案 0 :(得分:0)

首先,你不是你创建的ImageStream类型实例的disposing - 随后的调用,随着时间的推移,这必然会导致问题;尤其是20meg左右的图像!

另外,为什么每次通话都会创建缩略图?创建一次和cache,或刷新到磁盘:无论哪种方式,都提供“你之前制作的”,而不是一遍又一遍地进行处理。

但是,我建议您尝试最小化图像的大小(以字节为单位)。有人可能会争辩说,如果超过1meg,它们不应该在数据库中,而是将它们存储在磁盘上,并将数据存储在数据库中。我想这可以辩论,browse if interested

对于你的评论,我敦促你不要让其他范围控制另一个人拥有的资源;处理创建它们的范围内的项目(显然有时需要保留一些东西,但应该清楚它们的责任)。以下是对您的一些代码的一些修改:

if (imgType == "small")
{
    string small_loaction = getSmallLocationById(id);
    if(!File.exists(small_location)
    {
        byte[] imageBytes = getStreamFromDb(id);
        using (var imageStream = new MemoryStream(imageBytes))
        {
            using (var image = Image.FromStream(imageStream)) 
            {
                generateSmallImage(image, small_location)
            }
        }         
    }
    Response.TransferFile(small_location);
}
else if (imgType=="large")
{
    byte[] imageBytes = getStreamFromDb(id);
    Response.OutputStream.Write(imageBytes, 0, imageBytes.Length);
}