一、Liferay的上传
Liferay的上传与普通的Struts上传下载略有区别,故在此介绍一下其过程:
上传文件时,注意form的提交方式,由于采用的是StrutsPortlet,所以必须在PortletAction的processAction()方法内进行处理,否则得不到要提交的数据(在普通的Struts的ACTION内是否可行,还未试过),不同的方式提交会进入不同的方法,要让提交进入PortletAction的processAction()方法,在提交form时可有两种选择:
1.
有几点要注意,首先是此时提交的method="post",
其次enctype="multipart/form-data"这是上传文件的基本步骤,
关键在于portlet:actionURL,为了确保执行到PortletAction的processAction(),必须用actionURL的方式提交。
2.
第二种提交方式相对第一种要简单一些:
actionURL=true可以确保提交form时会执行PortletAction的processAction()方法,当然enctype="multipart/form-data"还是要加上,不过method="post"可以不要,因为html:form默认的提交方式就是post。如果用的是Struts,则ActionForm相对比较简单,只需要加相应的FormFile就行了,下面讲解一下在processAction()方法内上传文件的关键代码:
上面的path如果要指定在当前工程目录下,可以在工程目录下新一个文件夹,如caller/attachments,caller指的是工程名,要让path指定为
caller/attachments,可以这样,
如果上传文件不大的话,最好还是存在数据库里面,这样的话管理上传文件会方便很多。
还有一个问题,虽然与上传文件本身并没有什么关系,但是也是由上传文件造成的,那就是上传以后该怎么跳转?因为processAction()返回的是空,而不是ActionForward。
跳转方式有两种,
通过ActionForward跳转
这种方式比较简单,只要进入了processAction()内,然后设置一下forward即可,具体代码如下:
通过Action跳转
一般上传以后会重新执行查询,所以很可能会再执行另一个Action,而跳转到另一个Action的方法也有两种,一种是把ActionForward的名字直接写成Action的path(这种方法是比较复杂的了,有兴趣的可以研究一下,首先要求forward的name与path必须一样,还有什么redirect=true之类的东西),另一种则直接在processAction()方法进行处理:
到此,liferay的上传问题基本上讲完了,值得注意的是如果直接采用普通的Action的上传方式应该是可以的(其原理也是一样的),但是那样的话就不能在Action内部引用liferay的一些资源,故慎用之。
liferay的下载
Liferay的下载相对来说要简单一些,只要注意一些细节就可以了,如有一个超连接的代码:
其中唯一值得注意的是windowState=${state},表示打开此链接的状态,其state的值定义为:
在Action的具体的处理过程也比较简单,下面列出其关键代码:
其中的filePath指的是文件存放的路径。有一点注意,那就是下载时有些时候会出现中文文件名为乱码的问题,在catalina.bat文件中有如下代码(可能属性多少不一样):
set JAVA_OPTS=
-Xms128m -Xmx768m -XX:MaxPermSize=128m
-Dfile.encoding=UTF8
-Duser.timezone=GMT+8 -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config
保证文件编码为UTF8的话就可以了,如果为GBK的话,需在Action内对文件名进行相应的转码。
至此,liferay的下载就讲完了,值得注意的其实struts自身也有用于下载的Action,
如果记得没错的话,应该是在Struts1.2.6更新的,那就是DownloadAction,其功能是比较完善的了,也比较好用,由于这属于Struts的知识,在此不做介绍,相信网上也有很多关于这方面的介绍。
Liferay的上传与普通的Struts上传下载略有区别,故在此介绍一下其过程:
上传文件时,注意form的提交方式,由于采用的是StrutsPortlet,所以必须在PortletAction的processAction()方法内进行处理,否则得不到要提交的数据(在普通的Struts的ACTION内是否可行,还未试过),不同的方式提交会进入不同的方法,要让提交进入PortletAction的processAction()方法,在提交form时可有两种选择:
1.
<form method="post"
id="fileUp"
action="<portlet:actionURL
windowState="<%= WindowState.MAXIMIZED.toString() %>">
<portlet:param
name="struts_action" value="" />
<portlet:param
name="tabs1" value="${tabs1}"/></portlet:actionURL>"
enctype="multipart/form-data"
method="post" name="<portlet:namespace />fm">
有几点要注意,首先是此时提交的method="post",
其次enctype="multipart/form-data"这是上传文件的基本步骤,
关键在于portlet:actionURL,为了确保执行到PortletAction的processAction(),必须用actionURL的方式提交。
2.
第二种提交方式相对第一种要简单一些:
<html:form
action="/?actionURL=true&tabs1=${tabs1}">
</html:form>
actionURL=true可以确保提交form时会执行PortletAction的processAction()方法,当然enctype="multipart/form-data"还是要加上,不过method="post"可以不要,因为html:form默认的提交方式就是post。如果用的是Struts,则ActionForm相对比较简单,只需要加相应的FormFile就行了,下面讲解一下在processAction()方法内上传文件的关键代码:
FormFile formFile = Form.getFormFile();
String fileName = formFile.getFileName();
byte[] bytes = formFile.getFileData();
//path为上传文件的路径
File uploadedFile = new File(path,fileName);
RandomAccessFile raf = new RandomAccessFile(uploadedFile,"rw");
raf.write(bytes);
raf.close();
上面的path如果要指定在当前工程目录下,可以在工程目录下新一个文件夹,如caller/attachments,caller指的是工程名,要让path指定为
caller/attachments,可以这样,
String path =
this.servlet.getServletContext().getRealPath("/attachments");
如果上传文件不大的话,最好还是存在数据库里面,这样的话管理上传文件会方便很多。
还有一个问题,虽然与上传文件本身并没有什么关系,但是也是由上传文件造成的,那就是上传以后该怎么跳转?因为processAction()返回的是空,而不是ActionForward。
跳转方式有两种,
通过ActionForward跳转
这种方式比较简单,只要进入了processAction()内,然后设置一下forward即可,具体代码如下:
this.setForward(request, "portlet.pagination.hello");
通过Action跳转
一般上传以后会重新执行查询,所以很可能会再执行另一个Action,而跳转到另一个Action的方法也有两种,一种是把ActionForward的名字直接写成Action的path(这种方法是比较复杂的了,有兴趣的可以研究一下,首先要求forward的name与path必须一样,还有什么redirect=true之类的东西),另一种则直接在processAction()方法进行处理:
PortletURL portletURL =
((ActionResponseImpl)response).createRenderURL();
portletURL.setParameter("struts_action", "");
portletURL.setParameter("tabs1", "");
response.sendRedirect(portletURL.toString());
到此,liferay的上传问题基本上讲完了,值得注意的是如果直接采用普通的Action的上传方式应该是可以的(其原理也是一样的),但是那样的话就不能在Action内部引用liferay的一些资源,故慎用之。
liferay的下载
Liferay的下载相对来说要简单一些,只要注意一些细节就可以了,如有一个超连接的代码:
<html:link action="?actionURL=true&windowState=${state}&fileName=${message.remark}">
文件名
</html:link>
其中唯一值得注意的是windowState=${state},表示打开此链接的状态,其state的值定义为:
String state = LiferayWindowState.EXCLUSIVE.toString();
在Action的具体的处理过程也比较简单,下面列出其关键代码:
String fileName = ParamUtil.getString(req, "fileName");
//也可以通过request.getParameter("")的方法获取参数值
File file = new File(filePath, fileName);
if (file.exists()) {
InputStream fis = null;
try {
fis = new FileInputStream(file);
ServletResponseUtil.sendFile(((ActionResponseImpl) res)
.getHttpServletResponse(), fileName, fis);
this.setForward(req, forward);
} catch (Exception e) {
System.err.println(fileName + " is not exist!");
}finally {
ServletResponseUtil.cleanUp(fis);
}
}
其中的filePath指的是文件存放的路径。有一点注意,那就是下载时有些时候会出现中文文件名为乱码的问题,在catalina.bat文件中有如下代码(可能属性多少不一样):
set JAVA_OPTS=
-Xms128m -Xmx768m -XX:MaxPermSize=128m
-Dfile.encoding=UTF8
-Duser.timezone=GMT+8 -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config
保证文件编码为UTF8的话就可以了,如果为GBK的话,需在Action内对文件名进行相应的转码。
至此,liferay的下载就讲完了,值得注意的其实struts自身也有用于下载的Action,
如果记得没错的话,应该是在Struts1.2.6更新的,那就是DownloadAction,其功能是比较完善的了,也比较好用,由于这属于Struts的知识,在此不做介绍,相信网上也有很多关于这方面的介绍。