Liferay7 BPM门户开发之28: Portlet文件上传,及实体类同步更新上传

抓住核心 -- 王昕

Liferay文件上传的核心就是使用UploadPortletRequest类

继承关系
java.lang.Object
  extended byjavax.servlet.ServletRequestWrapper
    extended byjavax.servlet.http.HttpServletRequestWrapper
      extended bycom.liferay.util.servlet.UploadPortletRequest

实现关系:
Implemented Interfaces:

  • javax.servlet.http.HttpServletRequest
  • javax.servlet.ServletRequest

单一文件上传

jsp代码

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui"%>
<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui"%>
<portlet:defineObjects />

<portlet:actionURL name="upload" var="uploadFileURL"></portlet:actionURL>

<aui:form action="<%= uploadFileURL %>" enctype="multipart/form-data" method="post">

    <aui:input type="file" name="fileupload" />

    <aui:button name="Save" value="Save" type="submit" />

</aui:form>

java:

import java.io.File;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import org.apache.commons.io.FileUtils;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;

public class RelatedFilesPortlet extends MVCPortlet {

    private final static int ONE_GB = 1073741824;

    private final static String baseDir = "/tmp/uploaded/";

    private final static String fileInputName = "fileupload";

    public void upload(ActionRequest request, ActionResponse response)
            throws Exception {

        UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(request);

        long sizeInBytes = uploadRequest.getSize(fileInputName);

        if (uploadRequest.getSize(fileInputName) == 0) {
            throw new Exception("文件为空!");
        }

        // 从uploadRequest获得File对象
        File uploadedFile = uploadRequest.getFile(fileInputName);

        String sourceFileName = uploadRequest.getFileName(fileInputName);

        // 存储文件的目录
        File folder = new File(baseDir);

        // 对当前目录做可用空间检查
        if (folder.getUsableSpace() < ONE_GB) {
            throw new Exception("空间不足1GB!");
        }

        // 最终的文件路径
        File filePath = new File(folder.getAbsolutePath() + File.separator + sourceFileName);

        // 保存文件到物理路径
        FileUtils.copyFile(uploadedFile, filePath);

        //以下是保存在文档库
        ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
        ServiceContext serviceContext = ServiceContextFactory.getInstance(actionRequest);
        String contentType = MimeTypesUtil.getContentType(uploadedFile);
        InputStream inputStream  = new FileInputStream(uploadedFile);
        //要保存的文档库路径
        Folder folderName = DLAppLocalServiceUtil.getFolder(parentRepositoryId,
                                                            parentFolderId,
                                                            "Folder Name");
        long folderId = folderName.getFolderId();
        long repositoryId = folderName.getRepositoryId();
        //保存到文档库
        FileEntry fileEntry = DLAppLocalServiceUtil.addFileEntry(themeDisplay.getUserId(),
                                                                 repositoryId,
                                                                 folderId,
                                                                 uploadedFile.getName(),
                                                                 contentType,
                                                                 "File Name",
                                                                 "description",
                                                                 "changeLog",
                                                                 inputStream,
                                                                 uploadedFile.length(),
                                                                 serviceContext);
    }
}

关于文档库参数说明的解释:
http://blog.csdn.net/lan861698789/article/details/8122203

和实体类一起保存文件的Demo

public void addYourEntity(ActionRequest request, ActionResponse response)
    throws Exception {

    UploadPortletRequest uploadPortletRequest =
        PortalUtil.getUploadPortletRequest(request);

    long artistId = ParamUtil.getLong(uploadPortletRequest, "artistId");
    String name = ParamUtil.getString(uploadPortletRequest, "name");
    int year = ParamUtil.getInteger(uploadPortletRequest, "year");
    //更多的实体类信息
    ......

    InputStream inputStream = uploadPortletRequest.getFileAsStream("file");
    ServiceContext serviceContext = ServiceContextFactory.getInstance(
        YourEntity.class.getName(), uploadPortletRequest);

    try {
        YourEntityServiceUtil.addYourEntity(
            artistId, name, year, inputStream, serviceContext);

        SessionMessages.add(request, "YourEntityAdded");

        String redirect = ParamUtil.getString(
            uploadPortletRequest, "redirect");

        response.sendRedirect(redirect);
    }
    catch (Exception e) {
        SessionErrors.add(request, e.getClass().getName());

        if (e instanceof YourEntityNameException ||
            e instanceof PrincipalException) {

            response.setRenderParameter(
                "jspPage", "/html/YourEntitys/edit_YourEntity.jsp");
        }
        else {
            response.setRenderParameter("jspPage", "/html/error.jsp");
        }
    }
}
时间: 2024-08-25 11:03:43

Liferay7 BPM门户开发之28: Portlet文件上传,及实体类同步更新上传的相关文章

Liferay7 BPM门户开发之17: Portlet 生命周期

Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() init() 在Liferay容器部署portlet时,启动portlet实例化 init有两个写法: public void init() throws PortletException public void init(PortletConfig config) throws PortletEx

Liferay7 BPM门户开发之33: Portlet之间通信的3种方式(session、IPC Render Parameter、IPC Event、Cookies)

文章介绍了5种方式,4种是比较常用的: Portlet session IPC Public Render Parameters IPC Event Cookies 参考地址: https://web.liferay.com/zh/community/wiki/-/wiki/Main/Portlet%E9%97%B4%E7%9A%84%E9%80%9A%E4%BF%A1 方式1:Session portlet session作用域: APPLICATION_SCOPE  :全局 PORTLET_

Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发

hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为系统服务挂钩(Liferay Service Hook),还有其他类型的hook... Liferay6.2 时的hook开发比较有限,而在Liferay7则大为不同,OSGi services的彻底改进至Liferay的底层模型框架,使得Liferay可以支持更多的定制扩展!OSGi plugin

Liferay7 BPM门户开发之8: Activiti实用问题集合

1.如何实现审核的上级获取(任务逐级审批) 这个是必备功能,通过Spring的注入+Activiti表达式可以很容易解决. 可参考: http://blog.csdn.net/sunxing007/article/details/8491552 http://linhongyu.blog.51cto.com/6373370/1656596 2.如何设置流程发起人,并动态在其他任务中使用 通过变量,在启动的时候设置. activiti里设置流程发起人的功能很绕. activiti 指定发起人,并作

Liferay7 BPM门户开发之19: 理解Service Builder体系

Service Builder是Liferay为业务开发而设计的模型驱动(model-driven)平台工具,提供一系列的实体类.数据持久化.服务相关的代码自动生成服务.支持Hibernate and Spring集成,缓存处理,动态查询等特性.令人惊讶的是,Liferay所有的持久化代码.Servie接口代码都是由Service Builder自动生成的,可见其自动化程度之高. 注意:Liferay的数据持久化开发不是必需用Service Builder,你可以直接用JDBC.JPA等任何技术

Liferay7 BPM门户开发之42: Liferay核心JSP定制扩展

Liferay最大的好处是不仅接口强大,利于扩展,就连JSP定制扩展都提供了3种方式. 修改核心jsp代码,有3种修改方式:1.暴力修改直接修改(位于portal-web/docroot/html),编译部署,会带来风险,而且不能同步更新. 2.全量扩展修改热部署jsp文件(替代原有jsp),这是v7.0下的OSGi方式,实现方式非常优雅. 3.CustomJspBag Hook方式实现CustomJspBag接口,做jsp片段式的修改,同样是增量热部署,也是v7.0下的OSGi方式(需要增加依

Liferay7 BPM门户开发之30: 通用帮助类Validator、ArrayUtil、StringUtil等使用

简单.优雅.有序才是真的美   -- 王昕 废话不多说,直接上代码. 验证类Validator 主要是空验证.数字.格式验证 调用的例子: protected void validateEmailFrom(ActionRequest actionRequest){ String emailFromName = getParameter(actionRequest, "emailFromName"); String emailFromAddress = getParameter( act

Liferay7 BPM门户开发之36: 使用Portlet filters过滤器做切面AOP

使用Portlet filters过滤器做切面AOP Portlet Filters定义于JSR286 Java Portlet Specification 2.0 Portlet Filters是为了在4个生命周期的过程中,提供外部的AOP支持,这非常不显眼,但也很有用,比如可以用在Liferay的Hook开发中.JSR286 Java Portlet Specification 2.0 的更多介绍:http://www.ibm.com/developerworks/websphere/lib

Liferay7 BPM门户开发之14: Liferay开发体系简介

Liferay SDK 开发体系 主要分6种: Portlet Hook Theme Layout Templates Web Modules Ext Portlet :类似于servlet的web组件,编译后是war包,是页面的组成元素,可以把它理解为一个web APP 详细介绍:https://web.liferay.com/zh/products/what-is-a-portal/web-platform Hook:钩子插件,用来覆盖门户的JSP文件和配置文件,适用于仅需要少量(jsp)代