liferay-文件上传处理
来源:互联网 发布:魅力女生知乎 编辑:程序博客网 时间:2024/06/06 06:38
原文:http://www.huqiwen.com/2012/10/24/liferay-6-1-development-study-12-file-upload/
Liferay中提供了完善的文件处理,从liferay 6.1开始在文件的处理方面,不再区分文档和图片,统一为文件媒体库。在普通的portlet插件工程中,如果想将文件上传到Liferay的文档库中,大的阶段可以分为两个流程:一、在portlet中将上传的文件取到,二调用Liferay的API将文件上传到文档库中。
(注:这里的文件上传只讲服务端的处理,至于客户端也就是浏览器使用普通的表单文件上传,还是使用swffileupload或者ajax提交等与服务端没有关系,处理方法都是一样的)
一、在portlet中取到上传的文件
这两的获取有两种方法,一种是普通的fileupload的处理方法,一种是使用liferay的API
1、使用fileupload的处理方法:
此种方法的获取和在普通的servlet里面使用fileupload的方法一样,核心代码如下 :
DiskFileItemFactory factory = new DiskFileItemFactory(); //PortletFileUpload upload = new PortletFileUpload(factory); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(1024 * 1024 * 200); HttpServletRequest servletRequest = PortalUtil.getHttpServletRequest(request); List<FileItem> items = upload.parseRequest(servletRequest);
注:也可以使用此行代码,如果使用了此行则下面的HttpServletRequest servletRequest = PortalUtil.getHttpServletRequest(request)就可以不要,在upload.parseRequest里面传actionRequest。但是此方法在weblogic环境下面会出错,所以如果要在weblogic下面运行,请使用下面的servletFileUpload。
其他代码就和在普通的Servlet里面使用fileupload一样,这里不再多写。
2、使用Liferay的API获取上传文件
推荐使用下面的代码进行文件上传。
UploadPortletRequest uploadPortletRequest = PortalUtil.getUploadPortletRequest(actionRequest); String sourceFileName = uploadPortletRequest.getFileName("file"); String contentType = uploadPortletRequest.getContentType("file"); long size = uploadPortletRequest.getSize("file");// File file = uploadPortletRequest.getFile("file"); InputStream is = uploadPortletRequest.getFileAsStream("file");
注:其中的getFileName中的file为<input type="file" name="file">中的name值,具体的可以要看自己的调整。
二、将获取到的文件上传到Liferay的文档库
1、上传文件
在portlet中获取到我们上传的文件,只算是完成了第一步。取到了上传的文件,怎么传到Liferay的文件库中呢?暂时没有找到Liferay的文件上传接口,所以就自己研究用了一个折衷的办法。使用如下的接口
DLAppLocalServiceUtil.addFileEntry(long userId, long repositoryId, long folderId,java.lang.String sourceFileName, java.lang.String mimeType,java.lang.String title, java.lang.String description,java.lang.String changeLog, byte[] bytes,com.liferay.portal.service.ServiceContext serviceContext)
为什么说这个算是一个折衷的办法呢?因为DL开头的这类API算是Liferay内部API,有一天有可能会变掉,但对于应用而言基本上没有啥问题,最多是算不上优雅。
此接口的参数逐个说明:
long userId:上传此文件的用户id
long repositoryId:仓库存储ID,此ID一般为groupid
long folderId:文件夹ID,可以自己创建,或使用liferay默认的如:DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT等,最好是自己根据上传资源的情况分类,如新闻的存到新闻文件,博客的存成博客文件等
String sourceFileName:上传文件的源文件名
String mimeType:算是文件类型,可以使用mimeType = MimeTypesUtil.getContentType(fileName);根据文件名获取。
String title:文件标题,这个与SourceFileName的区别在于,此title是最终显示在系统上的,可以由用户输入,源文件名称是上传获取的文件名称,不能手动改变。可以留空。
String description:关于此文件的描述,可以留空。
String changeLog:文件修改日志,可以留空。
byte[] bytes:文件的正文件,字节数组。
ServiceContext serviceContext:此类可以通过以下代码
ServiceContext serviceContext = ServiceContextFactory.getInstance(DLFileEntry.class.getName(), request);
获取。此对象里面包含了一些环境信息,如groupid,companyid,权限,门户路径,当前语言,userId等信息。
在实际应用中可以自己将上面的这个接口再做一层封装,作为一个公共的文件上传接口,以供其他需要文件上传的地方调用,具体的请自行封装,这里就不再帖我封装的代码。
2、获取文件路径
上面的文件上传之后返回的是一个FileEntry的对象,如果获取到上传的文件的路径呢,方法如下,可以定义一个方法,用来返回文件路径,此方法对图片、各式文件都是有效。
public static String getFilePath(FileEntry fileEntry) { if (null!=fileEntry) { return "/documents/" + fileEntry.getRepositoryId() + "/" + fileEntry.getFolderId() + "/" + HttpUtil.encodeURL(HtmlUtil.unescape(fileEntry.getTitle()), true) + "/" + fileEntry.getUuid(); }else { //如有需要,此处可以定义一个默认图片 return StringPool.BLANK; }
有时候如果文件是一个图片,上传的图片可以很大,如何获取一个缩略图呢?如下:
public static String getSmallImagePath(FileEntry fileEntry){String path = getFilePath(fileEntry);
return path+"?imageThumbnail=1";
- liferay-文件上传处理
- Liferay文件的上传
- Liferay中的文件下载处理
- liferay中使用liferay-ui进行文件上传
- jsp文件上传处理
- [PHP]文件上传处理
- php处理上传文件
- 文件上传 简单处理
- 上传文件细节处理
- 文件上传处理
- PHP上传文件处理
- 文件上传处理函数
- 文件上传处理
- php上传文件处理
- php上传文件处理
- struts 文件上传处理
- PHP文件上传处理
- dubbo处理文件上传
- oracle数据库之基本概念
- poj1050 二维数组最大子序列矩阵和
- Android解决GPS定位时LocationManager只能绑定一个LocationListener的问题
- 有明确的方向才有更好的未来
- Poj1088
- liferay-文件上传处理
- declare的使用 (ex20.sh)
- Django 开始支持py3
- 一道面试题
- auto_ptr解析
- 算法导论02
- sizeof(city_array) = 8, sizeof(char *) = 8
- C++ 类型转换 atoi atol atof itoa ftoa <stdlib.h>
- oracle用户默认密码