`
z7swf
  • 浏览: 185695 次
社区版块
存档分类
最新评论

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中原有的
分享到:
评论
1 楼 smallgoldstone 2008-04-04  
PLT.12.3.1 Content Type
A portlet must set the content type of the response using the setContentType method of
the RenderResponse interface. The setContentType method must throw an
IllegalArgumentException if the content type set does not match (including wildcard
15 matching) any of the content types returned by the getResponseContentType method of
the PortleRequest objectlxxvi. The portlet container should ignore any character
encoding specified as part of the content type.


jsr168文档中的内容

相关推荐

    liferay development 中文

    同时,Liferay Form Builder可以创建自定义表单,用于收集和处理用户输入的数据。 6. **安全性与权限管理**:Liferay的安全模型基于Spring Security,提供角色、组、组织结构的精细权限控制。开发者需要理解如何...

    Liferay Portal Liferay IDE

    Liferay Portal Liferay IDE

    liferay的开发文档

    Portlets是Liferay中的核心组件,可以视为网页上的小型应用。通过学习这份文档,开发者能够理解portlet生命周期、渲染机制以及如何利用MVC Portlet模式进行开发。此外,文档还涵盖了portlet与Liferay服务的集成,如...

    Liferay 6 入门教程

    此外,"plugins开发指南11-plugin中开发hibernate应用.pdf"涵盖了在Liferay中使用Hibernate进行数据持久化的实践方法,这对于处理复杂业务逻辑至关重要。 "plugins开发指南13-liferay中使用ldap分析.pdf"讨论了...

    liferay 超级学习文档

    在Liferay中,Hibernate常用于处理数据持久化。通过配置,开发者可以在Liferay中集成Hibernate,使得模型对象可以直接映射到数据库表,无需编写大量的SQL代码。Liferay的Service Builder工具也可以与Hibernate结合,...

    liferay中文资源

    对于想要深入了解Liferay的人来说,这个压缩包将是一个宝贵的资源库,提供了丰富的学习材料和实践经验。无论是新手还是老手,都可以从中找到提升自己技能的路径。通过阅读文档、研究源码、参与讨论和实践工具,用户...

    liferay 整合struts例子

    将Liferay与Struts整合,可以充分利用Struts的业务逻辑处理能力和Liferay的门户管理特性,打造出高效、灵活的应用系统。 在这个"liferay 整合struts例子"中,我们可以学习到以下几个关键知识点: 1. **Liferay ...

    Liferay 主题开发官方文档中文翻译

    在现代Web开发领域中,网站不仅需要具备强大的功能,还需要拥有吸引人的视觉设计与良好的用户体验。Liferay作为一款开源的企业级门户平台,提供了丰富的工具与框架帮助开发者们实现这一目标。本文档旨在介绍Liferay ...

    liferay详细讲解 liferay项目完全讲解

    在这个“liferay详细讲解 liferay项目完全讲解”的资料包中,我们可以期待深入了解到关于Liferay的核心概念、开发实践以及与其相关的技术。 首先,我们看到一个名为“JBPM数据库表说明.doc”的文件,这暗示了...

    liferay扩展环境 liferay ext

    标题 "Liferay扩展环境 Liferay Ext" 涉及到的是Liferay门户平台的一个关键概念,Liferay Ext是用于扩展和定制Liferay功能的核心工具。Liferay是一个开源的企业级内容管理平台,它允许用户根据需求构建自定义的数字...

    Liferay的CAS SSO实现

    在Liferay中实现SSO(Single Sign-On)单点登录功能,可以让用户在一个系统登录后,无需再次输入凭证就能访问其他关联系统,极大地提高了用户体验。其中,CAS(Central Authentication Service)是一个广泛应用的...

    liferay如何在eclipse中配置开发和debug环境

    Liferay是一款开源的企业级Portal平台,它提供了丰富的功能和高度可定制性,广泛...如果你在过程中遇到任何问题,记得参照官方文档或联系提供帮助的人。在实践中不断探索和学习,你将能更好地驾驭Liferay的开发工作。

    Liferay入门帮助文档(Liferay开发指南)

    开发过程中,开发者需要理解Liferay的portlet生命周期,以及如何利用Liferay的服务API来处理数据操作。 总的来说,Liferay入门帮助文档是一个宝贵的资源,它不仅提供了Liferay的基础知识,还详细阐述了如何配置开发...

    liferay相关的代码

    通过深入源码,我们可以学习到如何在Liferay中创建portlet、theme、布局、服务等组件,以及如何处理权限、国际化和缓存等问题。此外,Liferay还使用了Hibernate进行持久化,了解这部分源码能帮助我们更好地进行...

    liferay portal 开发实例

    首先,让我们了解MVC模式在Liferay中的应用。在Liferay Portal中,Portlet是展示内容的基本单元,它可以通过MVC模式来实现业务逻辑、数据处理和视图呈现的分离。MVC架构允许开发者将程序分为三个主要部分:模型...

    LIFERAY的ppt课件

    1. **Portal Server**:这是Liferay的核心,负责处理请求、渲染页面和提供服务。 2. **Portlets**:Liferay支持多种类型的portlet,它们是可重用的UI组件,可以在门户页面上展示各种内容和服务。 3. **Themes**和**...

    liferay6.06

    《Liferay Portal 6.0.6 学习手册》是针对企业级开源门户平台Liferay Portal的一个详细学习指南,由作者李少华编写。本文将深入探讨Liferay Portal的基础知识,安装配置,源码分析,开发环境设置,以及基于Struts2的...

    Liferay合集.zip

    书中涵盖了从安装配置到创建自定义portlet、主题和布局的全过程,还讨论了Liferay的安全性和性能优化,帮助读者将Liferay应用于实际项目中。 《Liferay Portal Systems Development》则更侧重于Liferay的系统开发...

Global site tag (gtag.js) - Google Analytics