Liferay 6.1开发学习(十二):文件上传处理

2012年10月24日 Liferay 评论 29 条 阅读 18,529 views 次

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

你可以给我打个赏

微信打赏

用户头像

29 条留言  访客:21 条  博主:6 条   引用: 2 条

  1. avatar liferay学习

    力顶一个~~~ :mrgreen:

  2. 不知道能不能给个文件上传的demo看看,照着你写的,文件名称对象都获取不到,不知道怎么回事

  3. avatar zping123456

    文件名称对象都获取不到,不知道怎么回事

  4. avatar 小默

    胡总 在使用liferay api 获取上传的文件时 ,文件的名称和类型 都获取不到 是什么原因呢

  5. 你好,我初学liferay,我想了解下liferay自带的文件媒体库,在那里上传文件后,文件会存在哪里?

  6. 你好,我想问一下,Liferay的API获取上传文件时,liferay有没有提供附件类型以及大小限制的方法

  7. avatar 西安-学习

    hi 你好,胡总:

    我按上面的例子,写了例子,发现,文件可以上传到 文件媒体库中,但是文件被莫名其妙的重命名了,upload_00000003.txt 而且是在 “雷” 中(和“基本文件并列”)。

    请问是什么原因,是因为 上传的文件夹ID吗?

  8. avatar jerrylsxu

    留言是种美德,写点什么…

  9. avatar 北京-猫一只

    我按照上面的第二种方法做的上传,用的是DLAppLocalServiceUtil.addFileEntry。总提示
    com.liferay.portlet.documentlibrary.DuplicateFileException: 文件上传示例。这个错误,怎么解决呢。

  10. avatar 北京-猫一只

    我用了Liferay的api做上传,上传成功了。但是有3个问题:1.folderID是DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT时,文件的路径用下面的方法找不到。2.设置folderID为liferay默认,那么前台想显示,怎么写路径。3.用liferay的api,怎么把文件传到指定的文件夹,比如相对路径是/uploads,怎么设置这个目录的folderID。

  11. avatar 王旺旺

    用iferay的API获取上传文件时,需要userId,如果我想不登陆上传?就不能用iferay的API获取上传文件了吗?

  12. avatar happypanda

    有没有什么方法获得图片的长度和宽度?

    • avatar 胡启稳

      Liferay本身没有提供相关的API,可以读取到流封装到BufferedImage里面,然后再获取

  13. avatar hshanshan

    太棒了,胡老师是男神

  14. avatar hshanshan

    胡老师真实太好了 无私奉献自己宝贵的知识,力顶力顶,赞赞赞

来自外部的引用: 2 条

  • Liferay中上传文件后找不到 | IT人生录
  • Liferay中上传文件后找不到 – 博客 – Liferay Forge

给我留言

Copyright © IT人生录 保留所有权利.   主题设计 知更鸟 滇ICP备16001547号-1

用户登录

分享到: