前段时间在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代码
一、我们可以通过以上方法获得一个uploadReq来处理上传的图片。
二、uploadReq的使用
Liferay中新增和更新图片都是使用updateImage方法,是ImageLocalServiceUtil类的静态方法,该 类中还包含有其他包含对图片的操作,如:删除图片等等。查看SOURCE可以很直观的了解ImageLocalServiceUtil的相关信息。
在Liferay4.3.2中,updateImage的参数分别是:,updateImage(long 图片id,bytes[] 字节数组,"图片格式","高度","宽度","大小")。为了方便,以下是Liferay处理图片类的源码
另:注解是自己写的,不是SOURCE中原有的
原因是似乎在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 代码
- // 上传处理类
- UploadPortletRequest uploadReq = PortalUtil
- .getUploadPortletRequest(req);
一、我们可以通过以上方法获得一个uploadReq来处理上传的图片。
二、uploadReq的使用
java 代码
- // 获取表单的图片信息
- File PRODUCT_IMG = uploadReq
- .getFile(ProductDisplayTerms.PRODUCT_IMGID); //上传表单的name
- byte[] bytes = FileUtil.getBytes(PRODUCT_IMG);
- Long imageId = new Long(rs.getLong(ProductDisplayTerms.PRODUCT_IMGID));
- if ((bytes != null) && (bytes.length > 0)) {
- imageId = ProductUtil.createImageId();
- ImageLocalServiceUtil.updateImage(imageId.longValue(), bytes,
- "jpeg", 63, 63, 1);
- }
Liferay中新增和更新图片都是使用updateImage方法,是ImageLocalServiceUtil类的静态方法,该 类中还包含有其他包含对图片的操作,如:删除图片等等。查看SOURCE可以很直观的了解ImageLocalServiceUtil的相关信息。
在Liferay4.3.2中,updateImage的参数分别是:,updateImage(long 图片id,bytes[] 字节数组,"图片格式","高度","宽度","大小")。为了方便,以下是Liferay处理图片类的源码
java 代码
- public class ImageLocalServiceImpl extends ImageLocalServiceBaseImpl {
- //删除图片
- public void deleteImage(long imageId) throws SystemException {
- try {
- if (imageId > 0) {
- ImageUtil.remove(imageId);
- }
- }
- catch (NoSuchImageException nsie) {
- }
- }
- //查找数据库中PK为imageId的Image对象
- public Image getImage(long imageId)
- throws PortalException, SystemException {
- return ImageUtil.findByPrimaryKey(imageId);
- }
- //查找数据库中所有图片信息
- public List getImages() throws SystemException {
- return ImageUtil.findAll();
- }
- //查找数据库中从begin开始到end的图片信息
- public List getImages(int begin, int end) throws SystemException {
- return ImageUtil.findAll(begin, end);
- }
- //获得size为指定大小的图片对象
- public List getImagesBySize(int size) throws SystemException {
- return ImageUtil.findBySize(size);
- }
- //更新或保存图片
- public Image updateImage(
- long imageId, byte[] bytes, String type, int height, int width,
- int size)
- throws SystemException {
- //查找PK为imageId的图片
- Image image = ImageUtil.fetchByPrimaryKey(imageId);
- //若图片不存在,表示为新增图片,用传递的imageId参数创建一个IMAGE。
- //注意这里的imageId不要和数据库的重复,建议做一些处理
- if (image == null) {
- image = ImageUtil.create(imageId);
- }
- //设置相关字段信息
- image.setModifiedDate(new Date());
- image.setTextObj(bytes);
- image.setType(type);
- image.setHeight(height);
- image.setWidth(width);
- image.setSize(size);
- //更新保存
- ImageUtil.update(image);
- return image;
- }
- }
另:注解是自己写的,不是SOURCE中原有的