2011-05-19 63 views
1

嗨: 在我的应用程序中,我有一些图像保存在数据库中,所以我创建了一个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. 

事实上,我已经开了一个大的图像(几乎24M)与MSPAINT,然后再保存图像,我发现它的尺寸要小得多比起初。那么是否有可能在服务器端调整图像大小?或者其他好礼貌来解决我的问题?

回答

0

首先,您不是和Stream您创建的类型实例(给定后续调用),随着时间的推移,这肯定会导致问题;特别是在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); 
} 
+0

感谢您的关注。实际上,我将它们放置在“generateSmallImage”方法中。我做了缓存,我将缩略图保存在一个文件夹中,当我请求图像下载请求时,我会检查这个缓存文件是否存在,如果是的话,返回它,如果不生成小图像,如果生成小图像失败,我会重新渲染整个图像流到客户端。此外,我只是读取数据库的访问权限,数据库的所有者是其他人。 – hguser 2011-05-19 13:29:42

+0

感谢您的编码,事实上,我是新的C#,我以前使用Java之前,所以我从来没有使用“使用VAR”字。 – hguser 2011-05-19 13:41:46

相关问题