Liferay中上传文件后找不到

2016年04月08日 Liferay 暂无评论 阅读 3,399 views 次

在Liferay中有时候我们上传文件到工程的目录下面会出现找不到的情况,比如我们以前在普通的java web工程中会在docroot目录下面建立一个upload的目录,将文件上传到这个目录下面,访问的时候可以通过:http://xxx/upload/xxx.jpg这样的形式访问。

但是进入到Liferay中,比如我们有一个工程Demo-portlet,我们在docroot目录下面建立一个目录upload,用来存储我们上传的文件路径,比如有文件abc.jpg。

这个时候我们会碰到如下情况:

情况1:

在工程里面建立upload目录,我们在里面放一个abc.jpg的图片,部署后,我们可以通过地址:http://xxx/Demo-portlet/uplad/abc.jpg进行访问。这个时候是正常的。

情况2:

我们在代码里面,将文件上传到upload目录里面,但是这个时候我们通过类似这样的地址访问:http://xxx/Demo-portlet/uplad/abc.jpg,我们却发现访问不了!!!!用群里面的人说真是日了狗了!

问题原因

要解决这个问题,首先来看一下Liferay的机制,我们正常的工程部署后是在webapps下面,运行时也是在webapps下面,但是在liferay中部署是在webapps下面,运行是在temp下面对应的目录中的工程。

Liferay为什么做?

这样做是为了方便做热部署的,比如我正在运行一个工程,我现在热部署有些文件正在被tomcat使用中,这个时候热部署就不能重新加载或者冲突。所以Liferay利用了Tomcat本身提供的一个特性。可以查看Demo-portet工程下面的META-INF/context.xml里面有如下定义:

<Context
 antiJARLocking="true"
 antiResourceLocking="true"
/>

默认时这两个值是false的,将这个值改为true,在部署时会在temp目录下面复制一份,运行时真正运行的代码是在temp对应目录里面的,这个是利用的Tomcat本身提供的功能。在7.0中采用OSGI就不再存在此问题。

情况2的原因是我们写的代码读取路径的时候读取路径是temp/0x-demo-portlet/upload,我们将图片存到了这个目录下面,但是运行的代码找的却是webapps/demo-portlet/upload这个目录,里面的图片所以找不到。

 

解决办法

其实将文件存到工程目录下面不是一个好的选择,单机还好,如果是集群环境就没有办法解决文件共享的办法。解决方法有两种:

方法一:使用Liferay的文件上传,将文件上传到文档媒体库中,参考前面的博客《Liferay 6.1开发学习(十二):文件上传处理

方法二:和方法一类似,我们在代码里面将文件上传到Liferay home下面,然后使用代码从本地读取再返回,和方法一的区别是方法一是采用的Liferay的实现,方法二采用的自己的实现。

你可以给我打个赏

微信打赏

用户头像

给我留言

您必须 登录 才能发表留言!

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

用户登录

分享到: