Liferay中让人郁闷的图片处理

前段时间在LIFERAY的开发过程中需要对图片进行处理,于是按照传统的方式自己写,结果郁闷了两天,怎么都不行。
原因是似乎在LIFERAY中无论如何调用response.setPortletContentType("image/jpeg");最后都是以“text/html”的形式输出,导致二进制图片显示不正常。我是将图片保存在数据库的BLOB字段中。
后来调试研究他的SOURCE,发现LIFERAY中ContentType参数如果不是以"text/html"开头的都会返回false,最终抛出一个不合法的参数异常。郁闷郁闷。。。。
本想绕过LIFERAY,结果却发费了更多时间,没办法只好回头来研究LIFERAY中自己使用图片上传功能。

Liferay的图片都保存在数据库中。主要的表是IMAGE表,查看他的数据信息,发现他保存图片的字段类型为CLOB,而不是BLOB。现在的问题来了,ORACLE中用CLOB保存图片和BLOB保存图片有什么不同?正在查证学习中。。若有朋友路过看到这篇帖子,请千万要不吝赐教哦。

下面来分析LIFERAY处理图片上传的JAVA代码
java 代码
 
  1. // 上传处理类  
  2. UploadPortletRequest uploadReq = PortalUtil  
  3.                     .getUploadPortletRequest(req);  

一、我们可以通过以上方法获得一个uploadReq来处理上传的图片。
二、uploadReq的使用
java 代码
 
  1. // 获取表单的图片信息  
  2. File PRODUCT_IMG = uploadReq  
  3.                     .getFile(ProductDisplayTerms.PRODUCT_IMGID);  //上传表单的name
  4. byte[] bytes = FileUtil.getBytes(PRODUCT_IMG);  
  5.   
  6. Long imageId = new Long(rs.getLong(ProductDisplayTerms.PRODUCT_IMGID));  
  7. if ((bytes != null) && (bytes.length > 0)) {  
  8.     imageId = ProductUtil.createImageId();  
  9.     ImageLocalServiceUtil.updateImage(imageId.longValue(), bytes,  
  10.                         "jpeg"63631);  
  11. }  

Liferay中新增和更新图片都是使用updateImage方法,是ImageLocalServiceUtil类的静态方法,该 类中还包含有其他包含对图片的操作,如:删除图片等等。查看SOURCE可以很直观的了解ImageLocalServiceUtil的相关信息。
在Liferay4.3.2中,updateImage的参数分别是:,updateImage(long 图片id,bytes[] 字节数组,"图片格式","高度","宽度","大小")。为了方便,以下是Liferay处理图片类的源码

java 代码
 
  1. public class ImageLocalServiceImpl extends ImageLocalServiceBaseImpl {  
  2.   
  3.         //删除图片  
  4.     public void deleteImage(long imageId) throws SystemException {  
  5.         try {  
  6.             if (imageId > 0) {  
  7.                 ImageUtil.remove(imageId);  
  8.             }  
  9.         }  
  10.         catch (NoSuchImageException nsie) {  
  11.         }  
  12.     }  
  13.   
  14.         //查找数据库中PK为imageId的Image对象  
  15.     public Image getImage(long imageId)  
  16.         throws PortalException, SystemException {  
  17.   
  18.         return ImageUtil.findByPrimaryKey(imageId);  
  19.     }  
  20.   
  21.         //查找数据库中所有图片信息  
  22.     public List getImages() throws SystemException {  
  23.         return ImageUtil.findAll();  
  24.     }  
  25.   
  26.         //查找数据库中从begin开始到end的图片信息  
  27.     public List getImages(int begin, int end) throws SystemException {  
  28.         return ImageUtil.findAll(begin, end);  
  29.     }  
  30.   
  31.         //获得size为指定大小的图片对象  
  32.     public List getImagesBySize(int size) throws SystemException {  
  33.         return ImageUtil.findBySize(size);  
  34.     }  
  35.   
  36.         //更新或保存图片  
  37.     public Image updateImage(  
  38.             long imageId, byte[] bytes, String type, int height, int width,  
  39.             int size)  
  40.         throws SystemException {  
  41.   
  42.                 //查找PK为imageId的图片  
  43.         Image image = ImageUtil.fetchByPrimaryKey(imageId);  
  44.                 //若图片不存在,表示为新增图片,用传递的imageId参数创建一个IMAGE。  
  45.                 //注意这里的imageId不要和数据库的重复,建议做一些处理  
  46.         if (image == null) {  
  47.             image = ImageUtil.create(imageId);  
  48.         }  
  49.                 //设置相关字段信息  
  50.         image.setModifiedDate(new Date());  
  51.         image.setTextObj(bytes);  
  52.         image.setType(type);  
  53.         image.setHeight(height);  
  54.         image.setWidth(width);  
  55.         image.setSize(size);  
  56.                 //更新保存  
  57.         ImageUtil.update(image);  
  58.   
  59.         return image;  
  60.     }  
  61.   
  62. }  

另:注解是自己写的,不是SOURCE中原有的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值