附件上传
首选说一下文件的存放位置,存放目录大致如下:
{bundles.home}/data/document_library/10115/0/customerDirName/0/fileName/1.0
这里主要是利用liferay现有的文档库,当然这些文件在文档库是看不到的!
下面说一下具体的实现:
1、首先要在liferay项目中的service.xml 中找到需要关联附件的表对应的entity标签,,在</entity>之前加上
<reference package-path="com.liferay.documentlibrary" entity="DL" />
大致表示的的是与文档库对应的接口相关联,只有这样才能在自己的实体类对应的service层的实现类中调用文档库提供的dlService对象,下面会看到的具体的使用的
例如:
<entity name="Contract" local-service="true" remote-service="false">
<column name="contractId" type="long" primary="true" />
<column name="companyId" type="long" />
<column name="name" type="String" />
<column name="haveAuthorizationBook" type="boolean" /><!-- 这里是用来标示是不是有附件的一个字段-->
<column name="authorizationBookName" type="String" />
<!-- 这里是有附件文件的名字的字段-->
<finder name="CompanyId" return-type="Collection">
<finder-column name="companyId" />
</finder>
<!-- References -->
<reference package-path="com.liferay.documentlibrary" entity="DL"></reference>
</entity>
2、就是对jsp(或者html)中的表单加上一个属性enctype="multipart/form-data"
(就是上传文件所需要的表单属性,你懂的)
<form action="" method="post" enctype="multipart/form-data">
这里有需要上传文件的选择框
<inputname="AuthorizationBook" size="70" type="file" />
</form>
3.就是保存表单提交给服务器的处理了
首先就是要获得一个uploadRequest 对象
UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(actionRequest);
之后传递过来的参数都需要通过uploadRequest 对象才能够获得哦!
如:String name = ParamUtil.getString(uploadRequest, "name");
下面就是获得要上传的文件了
File file = uploadRequest.getFile(fileParamName);
String fileName = uploadRequest.getFileName(fileParamName);
byte[] bytes = FileUtil.getBytes(file);
String dirName = TextUtil.getAnnexPath("contract_authorization_book", contract.getCreateUserId(), contract.getContractId());// 这个是用来获得附加要存放的在文档库中的路径的,可以自行定义,这里获得结果是使用字符串拼成的路径,规则是:三个参数相连接。这只是个例子,可以自由发挥的!!
contract.setAuthorizationBookName(fileName);
merge = contract.getHaveAuthorizationBook();
contract.setHaveAuthorizationBook(true);
ContractLocalServiceUtil.updateContractRealtionFile(contract, dirName, fileName,bytes, merge); //这个方法是在ContractLocalServiceImpl中实现的
4.ContractLocalServiceImpl中的实现
publicvoid updateContractRealtionFile(Contract contract,String dirName,String fileName,byte[] bytes,boolean hadDirectory) throws SystemException, PortalException{
long companyId=contract.getCompanyId();
//下面三个是liferay中的几个常量。
String portletId = CompanyConstants.SYSTEM_STRING;
long groupId = GroupConstants.DEFAULT_PARENT_GROUP_ID;
long repositoryId = CompanyConstants.SYSTEM;
if(hadDirectory){
try {
dlService.deleteDirectory(companyId, portletId, repositoryId, dirName);
}catch (NoSuchDirectoryException nsde) {
if (_log.isDebugEnabled()) {
_log.debug(nsde.getMessage());
}
}
}
dlService.addDirectory(companyId, repositoryId, dirName);
try {
dlService.addFile(companyId, portletId, groupId, repositoryId,dirName + File.separator + fileName, 0, StringPool.BLANK,
contract.getCreateDate(), new String[0], new String[0],bytes);
}catch (DuplicateFileException dfe) {
if (_log.isDebugEnabled()) {
_log.debug(dfe.getMessage());
}
}
contractPersistence.update(contract);
}
在这个方法中含有相应的逻辑处理,除了上面标红的部分要注意外,对于dlService方法的调用可以自由发挥的
5.附件的显示
<c:if test="<%=contract.getHaveAuthorizationBook() %>">
<li class="shortItem">
<span>
<liferay-ui:message key="authorization.book.file" />
</span>
<label>
<a href="<portlet:actionURL windowState="<%= LiferayWindowState.EXCLUSIVE.toString() %>">
<portlet:param name="<%=ActionRequest.ACTION_NAME %>" value="get.contract.annex.file" />
<portlet:param name="contractId" value="<%= String.valueOf(contract.getContractId()) %>" />
<portlet:param name="flagDirectory" value="<%=Constants.CONTRACT_ANNEX_AUTHORIZATION_BOOK %>" />
</portlet:actionURL>">
<%=contract.getAuthorizationBookName() %>
</a></label>
</li>
</c:if>
6、下载
5中已经把下载的连接写出来了,这里就是后台的处理了,如下:
String fileName = contract.getAuthorizationBookName();
String filePath = TextUtil.getAnnexPath("contract_authorization_book
", createUserId, contractId)+separator+fileName;//这个与上面保存文件使用的是同一个方法获得路径
HttpServletResponse response=PortalUtil.getHttpServletResponse(portletResponse);
InputStream is = null;
try {
is = DLLocalServiceUtil.getFileAsStream(
companyId, CompanyConstants.SYSTEM, filePath);
int contentLength = (int)DLServiceUtil.getFileSize(
companyId, CompanyConstants.SYSTEM, filePath);
response.setHeader(
HttpHeaders.CACHE_CONTROL, HttpHeaders.CACHE_CONTROL_PUBLIC_VALUE);
response.setHeader(HttpHeaders.PRAGMA, HttpHeaders.PRAGMA_PUBLIC_VALUE);
String contentDisposition =
"attachment; filename=\"" + new String(fileName.getBytes("UTF-8"),"ISO-8859-1") + "\"";
response.setContentLength(contentLength);
response.setHeader(
HttpHeaders.CONTENT_DISPOSITION, contentDisposition);
write(response, is, contentLength);
}
finally {
ServletResponseUtil.cleanUp(is);
}
下面是就是附带的几个下载的时候需要的方法
publicstaticvoid write(
HttpServletResponse response, InputStream is, int contentLength)
throws IOException {
OutputStream os = null;
try {
if (!response.isCommitted()) {
if (contentLength > 0) {
response.setContentLength(contentLength);
}
os = new BufferedOutputStream(response.getOutputStream());
int c = is.read();
while (c != -1) {
os.write(c);
c = is.read();
}
}
}
finally {
cleanUp(os, is);
}
}
publicstaticvoid cleanUp(OutputStream os, InputStream is) {
cleanUp(os);
cleanUp(is);
}
publicstaticvoid cleanUp(OutputStream os) {
try {
if (os != null) {
os.flush();
}
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e);
}
}
try {
if (os != null) {
os.close();
}
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e);
}
}
}
publicstaticvoid cleanUp(InputStream is) {
try {
if (is != null) {
is.close();
}
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e);
}
}
}
附注,因为在程序涉及到了比较多的逻辑处理,这里写是最主要的过程,具体的逻辑处理可以自己发挥!
相关推荐
【Liferay 5.2.3 环境搭建】是指在本地计算机上配置和安装Liferay Portal 5.2.3版本的过程。Liferay是一个全面的门户平台,基于Java Enterprise Edition (J2EE) 技术构建,利用EJB(Enterprise JavaBeans)和JMS...
【Liferay 5.2.3 开发环境搭建】 Liferay 是一款强大的开源门户平台,基于J2EE架构,融合了EJB、JMS等多种技术。它的前端使用Struts MVC框架,通过XML配置文件实现portlet的动态扩展。此外,Liferay还集成了Web服务...
Liferay5.2.3的样例,通过war.bat打包后发布到相应的liferay环境即可。 另外,需要配置context,tomcat中的代码如下: </Context>
### Liferay 5.2.3 Tomcat6 Eclipse IDE 开发文档详解 #### 一、前言 **1.1 编写说明** 本开发文档旨在为初学者和经验丰富的开发者提供全面指南,涵盖Liferay 5.2.3与Tomcat6在Eclipse IDE中的集成、配置和开发...
本篇文章将详细讲解如何在基于Myeclipse 6和Tomcat 6.0.24的环境中搭建Liferay 5.2.3的二次开发环境。 **一、环境准备** 在开始Liferay的开发工作之前,我们需要准备好以下软件: 1. **Myeclipse 6**: 这是一个...
本案例中,我们将探讨如何将Liferay 5.2.3与CAS(Central Authentication Service)配置为SSO系统。 Liferay是一款开源的企业级门户平台,它提供了一个灵活的框架来构建和管理Web应用程序。而CAS则是一个开源的身份...
liferay 5.2.3 可實際用於建構 jbpm workflow portlet的 jbpm檔。 用這個檔案加上mule再參考網路上的設定文件,即可輕易的在5.2.3上完成workflow portlet的建置... mule檔太大,請在liferay網路上下載即可
- **下载Liferay 5.2.3**:首先,你需要从Liferay的官方仓库或互联网存档中下载Liferay Portal 5.2.3 GA4的版本。确保选择适合你的操作系统的版本,通常有Windows、Linux和Mac OS X可供选择。 - **开发工具**:...
本教程将聚焦于Liferay 5.2.3版本的二次开发环境搭建,这将为开发者提供一个深入理解Liferay工作原理并进行自定义扩展的基础。 首先,我们需要下载Liferay 5.2.3的源码。Liferay的源代码可以从其官方网站的历史版本...
Liferay Plugins SDK 5.2.3 是一个专门用于开发Liferay Portal的portlet和其他插件的应用开发工具包。Liferay Portal是一款开源的企业级内容管理平台,它提供了丰富的功能,包括网站构建、社交网络、协作工具等。这...
5. **部署portlet**:将WAR文件上传到Liferay Portal服务器的deploy目录下,服务器会自动检测并部署portlet。 6. **测试和调试**:在Liferay Portal上查看和测试portlet的功能,根据需要进行调整。 **Portlet API...
本压缩包中的资料主要涵盖了Liferay 5.2.3版本以及一些相关的Struts-portlet和JSF-portlet开发知识。 1. **Liferay Portal 权限管理**: Liferay的权限系统是其核心功能之一,它允许管理员精细控制用户对门户资源...
本篇将详细介绍如何搭建Liferay 5.2.3的开发环境。 1. 关于 Liferay Liferay Portal提供了丰富的功能,如内容管理、文档共享、论坛、博客、工作流等,并支持多语言、多主题、自定义portlet等特性。5.2.3是Liferay的...
【Liferay 5.2.3 环境搭建】是指在本地计算机上配置和安装 Liferay Portal 5.2.3 版本的过程。Liferay 是一款基于 J2EE 技术的开源门户平台,它集成了多种技术,如 EJB、JMS、Struts MVC 框架和 Lucene 全文检索。该...
Support For Liferay 5.2.3 & Web space 10.0 U4 Support For both NetBeans 6.5.x & 6.7 Page Navigation Fix For Visual JSF Portlet
Liferay多文件上传与下载实例,前端包含多文件上传JS,可以动态追加文件,删除文件,还有文件类型与大小验证JS。后端可以批文件上传。 下载可以实现弹出页另存为。避免了Liferay自身下载PDF和图片时在当前页面打开的...
app.server.parent.dir=D:/StationPlatform/liferay-portal-tomcat-6.0-5.2.3/liferay-portal-5.2.3 app.server.tomcat.version=6.0 app.server.tomcat.dir={app.server.parent.dir}/tomcat-6.0.18 ``` **4. ...
在Liferay中实现上传和下载功能是企业级应用中常见的需求。Liferay提供了多种方式来处理文件的上传和下载,以便用户能够方便地管理他们的文档和资源。本文将详细探讨两种主要的方法,并提供一个基于JSP的简单示例。 ...
Liferay Portal Liferay IDE