ext 显示图片
你好很感谢你前几天帮我解决的问题现在还有一个问题想请教:项目碰到一难题请教大牛我们前台用ext展示从数据库中查到数据信息有一列是图片列我们的图片信息也是存在数据库中了是字...
你好 很感谢你前几天帮我解决的问题 现在还有一个问题想请教:项目碰到一难题 请教大牛 我们前台用ext展示从数据库中查到数据信息 有一列是图片列 我们的图片信息也是存在数据库中了 是字节流 请问各位有什么办法读取并显示么?
请注意不是把图片路径存在库中了 而是直接把图片序列化存进去了
数据库表结构如图:其中value字段是图片序列化的值
麻烦你了 展开
请注意不是把图片路径存在库中了 而是直接把图片序列化存进去了
数据库表结构如图:其中value字段是图片序列化的值
麻烦你了 展开
2个回答
展开全部
之前项目中也使用过文件对象序列化保存到数据库, 楼上说的方法在单应用服务器的情况是可行的. 但如果项目规模较大, 使用负载均衡的情况下, 无法使用文件系统存放临时文件, 要在所有节点都从单一位置取临时文件, 我们项目中使用了Memcached(简单来说, memcached就是内存中一个巨大的HashMap, 网上资料很多). 完整的代码就不方便贴了, 说下大致实现:
1, 所有的临时文件从一个action(使用struts, 使用其它框架也一样)取, 文件类型(如果有多种类型)及id作为参数. 这个action做几件事:
1) 在memcached中维护两类数据, 用不同的前缀区分, 一类用于存放文件的所有分块id(考虑到性能问题, 我们所有的文件都是分块存放的, 这个要参考数据种类及配置, 我们的项目中分块是16K) , 前缀+文件id作为key, 文件分块id列表数组作为值(文件不分块的话就不需要了). 另一类存放文件分块, 前缀+分块id作为key, 文件分块数据byte[]作为值.
2) 根据参数文件ID到memcached中查找分块列表, 没有就从数据库里取(注意要排序), 并写入memcached(文件不分块的话就不需要了)
3) 根据分块列表找到所有文件分块数据, 没有就从数据库里取, 并写入memcached
4) 根据文件类型设置response的contentType, 将所有分块写入response
2, 前台grid中显式文件id的列写一个renderer, 将文件id格式化成html 类似这样 '<a href="#" target="_self" onclick="javascript: getFile(' + 文件id + ')">下载</a>'(不用grid的话, 那直接在后台构造html), 写getFile方法, 就是在当前页面插入一个iframe, src设为取文件的action机上文件id参数. 这样客户端就会出现下载提示了. 如果你是要在某个固定地方显式图片, 那getFile方法就是改img标签的src.
3, 做完上面两件事基本功能就实现了, 但是这样memcached数据一直增, 所以要写缓存释放功能, 在多应用服务器的情况下, 将释放操作放在应用服务器端是不可行的. 所以我们就写了个单独的程序放在memcached上运行. 为了实现内存释放, 在取文件的action里要多维护一类数据, 存放文件最后的访问时间, 前缀+文件ID作为key, 访问时间作为值. 将文件写入mencached和从memcached读取文件是都要更新访问时间. 释放内存的程序设置了几个参数(参照连接池): 释放内存周期, 最大文件数, 释放文件数. 程序每隔固定周期遍历memcached, 获取所有文件访问时间数据, 按照访问时间升序排序, 从头开始取参数设置数量的文件id, 删除memcached中的文件数据, 释放内存.
4, 如果只用一个memcached, 会存在单点故障, 必须使用两台, 但是memcached没有自己的分布处理机制, 那就只有自己写代码了, 封装memcached的读写方法, 读的时候从随机一个取(平衡负载), 取不到再从另一个取, 都没有就返回空. 写的时候两个都写. 因为HashMap重复写也不会有什么问题, memcached本身也有一定保护机制, 所以线程同步的问题目前为止还没有发现过. 释放内存的程序也是要同时操作两个memcached.
既然能够写文件序列化, 说到这样代码应该也是能写出来了, 代码就不方便贴出来了.
1, 所有的临时文件从一个action(使用struts, 使用其它框架也一样)取, 文件类型(如果有多种类型)及id作为参数. 这个action做几件事:
1) 在memcached中维护两类数据, 用不同的前缀区分, 一类用于存放文件的所有分块id(考虑到性能问题, 我们所有的文件都是分块存放的, 这个要参考数据种类及配置, 我们的项目中分块是16K) , 前缀+文件id作为key, 文件分块id列表数组作为值(文件不分块的话就不需要了). 另一类存放文件分块, 前缀+分块id作为key, 文件分块数据byte[]作为值.
2) 根据参数文件ID到memcached中查找分块列表, 没有就从数据库里取(注意要排序), 并写入memcached(文件不分块的话就不需要了)
3) 根据分块列表找到所有文件分块数据, 没有就从数据库里取, 并写入memcached
4) 根据文件类型设置response的contentType, 将所有分块写入response
2, 前台grid中显式文件id的列写一个renderer, 将文件id格式化成html 类似这样 '<a href="#" target="_self" onclick="javascript: getFile(' + 文件id + ')">下载</a>'(不用grid的话, 那直接在后台构造html), 写getFile方法, 就是在当前页面插入一个iframe, src设为取文件的action机上文件id参数. 这样客户端就会出现下载提示了. 如果你是要在某个固定地方显式图片, 那getFile方法就是改img标签的src.
3, 做完上面两件事基本功能就实现了, 但是这样memcached数据一直增, 所以要写缓存释放功能, 在多应用服务器的情况下, 将释放操作放在应用服务器端是不可行的. 所以我们就写了个单独的程序放在memcached上运行. 为了实现内存释放, 在取文件的action里要多维护一类数据, 存放文件最后的访问时间, 前缀+文件ID作为key, 访问时间作为值. 将文件写入mencached和从memcached读取文件是都要更新访问时间. 释放内存的程序设置了几个参数(参照连接池): 释放内存周期, 最大文件数, 释放文件数. 程序每隔固定周期遍历memcached, 获取所有文件访问时间数据, 按照访问时间升序排序, 从头开始取参数设置数量的文件id, 删除memcached中的文件数据, 释放内存.
4, 如果只用一个memcached, 会存在单点故障, 必须使用两台, 但是memcached没有自己的分布处理机制, 那就只有自己写代码了, 封装memcached的读写方法, 读的时候从随机一个取(平衡负载), 取不到再从另一个取, 都没有就返回空. 写的时候两个都写. 因为HashMap重复写也不会有什么问题, memcached本身也有一定保护机制, 所以线程同步的问题目前为止还没有发现过. 释放内存的程序也是要同时操作两个memcached.
既然能够写文件序列化, 说到这样代码应该也是能写出来了, 代码就不方便贴出来了.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询