1、问题产生背景描述
原项目的附件组件是采用将附件存储到应用服务器硬盘的方式来实现附件上传,由于客户部署环境中内外网隔离,内外网用户的附件需要做同步,因此需要将附件改为存储到数据库中的方式。针对附件类型是图片的,还需要生成对应的缩略图。
2、问题描述
根据需求将附件组件修改完成后,经过测试,发现缩略图的显示非常慢,一个5K左右的缩略图需要30秒左右的时间才能显示完毕,而400K大小的原图显示也只需要1-2秒。
3、问题分析
分析原图及缩略图存储、获取相关的代码,发现可能存在问题的地方有两个:
(1)缩略图的生成算法
(2)缩略图的获取及显示
为了验证是不是缩略图的生成算法有问题,上网Google了n多的缩略图生成算法,并尝试是用不同的编码器生成各种格式的缩略图(gif\png\jpeg),但除了生成速度及大小略有不同外,缩略图的显示速度还是没有明显提升。
对比原图及缩略图的获取及显示代码,发现除了其查询的SQL外,其他地方并无二异。
4、问题解决
最终解决该问题的办法是将输出缩略图时用于缓存数据的字节数组的大小改为缩略图文件的大小。
PS:
(1)虽然问题已经解决了,但是还是不太明白到底是那里的问题,因为在修改代码之前,输出原图时的缓冲区的大小与输出缩略图的缓冲区是一样大的,但原图就不存在显示缓慢的问题。因此,只是误打误撞将问题解决了,产生问题的真正原因仍然需要进一步研究。
(2)在Google缩略图生成算法时,偶然发现一开源组件,貌似功能很强大,记录于此,以备后用。
项目名称:Thumbnailator
项目主页:http://code.google.com/p/thumbnailator/
当前的最新版本为0.3.0
下载地址:http://code.google.com/p/thumbnailator/downloads/list
------------------------------------2011年2-16日补充-----------------------------------
经过进一步的代码分析,终于找到真正的问题所在
错误代码:
response.setContentLength(fileSize);
问题产生的原因是此处设置的fileSize误设为原图的文件大小,致使浏览器响应出现问题。将fileSize改为缩略图实际大小后问题解决。