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";