Liferay Portal额外研究(6):Portlet附件上传处理的点滴

作者:胡长城(银狐999)
时间:2006年9月5日晚
 
首先更正上一篇有关多分发 Action处理的一些严重Bug。
 
更正一:在上篇中,我比较倾向于直接基于 Struts DispatchAction扩展,这是错误的,应该尽量基于PortletAction,虽然这样会让扩展增加一些Struts DispatchAction本已有的代码,但是这才是符合Portlet Action处理思想的。并且在Liferay的内部处理中,对于actionurl处理的情况下,是强制必须基于PortletAction扩展的。
更正二:在上篇中,多分发处理的样例代码只侧重对 Render的多分发,其实这是不完善的,也容易造成误导。在Porttal的Portlet请求处理,是分为:Action和Render两个阶段的。其实真正的多业务处理更应该在Action阶段来完成,Render则主要负责对push位置和页面数据进行渲染。
 
在 Liferay中开发附件上传处理应用,要比在单纯Servlet和Struts Action中开发简单很多。但是需要注意的是,必须在Action阶段才能处理附件File对象,而在Render阶段已经不能处理了。
 
让我们首先来看一下 com.liferay.portal.servlet.MainServlet类,此类是所有“/c”请求的转移控制类。在此类中,liferay对含有文件上传的请求做了拦截和封装,利用UploadServletRequest类来包装原始的http request请求

if  ((contentType  !=   null &&
            (contentType.startsWith(
" multipart/form-data " ))) {
            req 
=   new  UploadServletRequest(req);
}

        在UploadServletRequest类中,则将所有当前请求参数进行了提取,并对上传的文件做了临时存储。实际上内部是采用Apache Commons Upload进行的封装。
        这样在PortletAction的procesAction处理中,可以对上传附件进行业务处理和存储。       当然,你可以通过ActionRequest来强制自己获取原始的UploadServletRequest对象,可以如下操作:

public   class  NewFileUploadAction  extends  PortletAction {
    
public   void  processAction(
            ActionMapping mapping, ActionForm form, PortletConfig config,
            ActionRequest req, ActionResponse res)
        
throws  Exception {
        
         
// 注意这里面是获取UploadPortletRequest对象
        UploadPortletRequest urequest  =  PortalUtil.getUploadPortletRequest(req);
         File f 
=  urequest.getFile( " file1 " );
}

 

// req是ActionRequest对象
ActionRequestImpl reqImpl  =  (ActionRequestImpl)req;
HttpServletRequest httpReq 
=  reqImpl.getHttpServletRequest();
UploadServletRequest urequest 
=  (UploadServletRequest)httpReq;

      置于在Action处理阶段,获取到UploadServletRequest对象后存储附件、过滤附件类型等操作就很容易实现了,此处不再累赘叙述。
      不过在附件上传中都会涉及到一个问题:控制附件上传的大小和类型。对于类型的控制,liferay没有提供任何控制和扩展实现机制,这个只能开发人员在外围自己实现。

    对于控制附件上传大小,则只能通过在 system_ext.properties配置“com.liferay.util.servlet.UploadServletRequest.max.size”属性来统一设置。
    从这两个方面来讲, liferay对附件的处理不够灵活,在开发过程中,还需要做一定封装来辅助。
 
    稍微在这里补充一点,开发人员可以通过在页面请求 url中,根据参数来决定是否执行action阶段。
    如下所示,通过 renderResponse createActionURL createReanderURL 来决定提交请求是否执行 Action 阶段,但注意,都会执行 reader 阶段的。

<%
PortletURL portletURL 
=  renderResponse.createActionURL();
portletURL.setWindowState(WindowState.MAXIMIZED);
portletURL.setParameter(
" struts_action " " /venus/template/fileupload/FileUpoadAction " );
portletURL.setParameter(
" cmdx " " uploadfile " );
portletURL.setParameter(
" cmd " " add " );
%>

< form name = " testForm "  method = " post "  
action
= " <%= portletURL.toString() %> "  
enctype
= " multipart/form-data " >
</ form >

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值