Liferay 6.1开发学习(十二):文件上传处理
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的文件库中呢?使用如下的接口
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)
此接口的参数逐个说明:
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 getFilePath(FileEntry fileEntry) { if (null!=fileEntry) { return "/documents/" + fileEntry.getRepositoryId() + "/" + fileEntry.getUuid(); }else { //如有需要,此处可以定义一个默认图片 return StringPool.BLANK; }
有时候如果文件是一个图片,上传的图片可以很大,如何获取一个缩略图呢?如下:
public static String getSmallImagePath(FileEntry fileEntry){String path = getFilePath(fileEntry);
return path+"?imageThumbnail=1";
}
力顶一个~~~
胡总万岁!
你好,你可以成功的上传图片吗?并显示出来
肯定可以上传嘛,显示也是没有问题的
我用这个方法成功了!!! 😛 😛 可怎么没有下载呢??? 😥
下载看后面的一篇文章,里面有下载的说明的
你好,请问我上传的jsp页面刷新就表单重复提交,怎么办?? 🙂
不知道能不能给个文件上传的demo看看,照着你写的,文件名称对象都获取不到,不知道怎么回事
文件名称对象都获取不到,不知道怎么回事
胡总 在使用liferay api 获取上传的文件时 ,文件的名称和类型 都获取不到 是什么原因呢
你看那个file是你的表单里面的file这个input的name值,看是否对应上了
能取到了,刚才去看了下UploadPortletRequest 源码,他怎么是个借口啊,而且 他的实现类 也没找到.
刚才看错了,还是没取到啊
你好,我初学liferay,我想了解下liferay自带的文件媒体库,在那里上传文件后,文件会存在哪里?
你好,我想问一下,Liferay的API获取上传文件时,liferay有没有提供附件类型以及大小限制的方法
hi 你好,胡总:
我按上面的例子,写了例子,发现,文件可以上传到 文件媒体库中,但是文件被莫名其妙的重命名了,upload_00000003.txt 而且是在 “雷” 中(和“基本文件并列”)。
请问是什么原因,是因为 上传的文件夹ID吗?
重命名可能是由于怕文件重复
NO DLFolder exists with the primary key 22333
胡总,使用liferay上传文件报了这个错,该怎么解决
留言是种美德,写点什么…
我按照上面的第二种方法做的上传,用的是DLAppLocalServiceUtil.addFileEntry。总提示
com.liferay.portlet.documentlibrary.DuplicateFileException: 文件上传示例。这个错误,怎么解决呢。
这个文件已经存在了,将这个文件重命名后,重新上传
是的,谢谢。这个问题按照你的方法成功解决了。
我用了Liferay的api做上传,上传成功了。但是有3个问题:1.folderID是DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT时,文件的路径用下面的方法找不到。2.设置folderID为liferay默认,那么前台想显示,怎么写路径。3.用liferay的api,怎么把文件传到指定的文件夹,比如相对路径是/uploads,怎么设置这个目录的folderID。
用iferay的API获取上传文件时,需要userId,如果我想不登陆上传?就不能用iferay的API获取上传文件了吗?
有没有什么方法获得图片的长度和宽度?
Liferay本身没有提供相关的API,可以读取到流封装到BufferedImage里面,然后再获取
太棒了,胡老师是男神
胡老师真实太好了 无私奉献自己宝贵的知识,力顶力顶,赞赞赞