无名商城论坛

搜索
查看: 230|回复: 0

[其他技术] 【冷漠】Liferay找不到文件

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 17:25:13 | 显示全部楼层 |阅读模式
本教程来源于网络,侵权联系删除
在Liferay中有时候我们上传文件到工程的目录下面会出现找不到的情况,比如我们以前在普通的java web工程中会在docroot目录下面建立一个upload的目录,将文件上传到这个目录下面,访问的时候可以通过:
本帖隐藏的内容需要【资源会员】才可浏览,您需要升级才可浏览,点击这里升级【资源会员】

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

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

情况1:
在工程里面建立upload目录,我们在里面放一个abc.jpg的图片,部署后,我们可以通过地址:
本帖隐藏的内容需要【资源会员】才可浏览,您需要升级才可浏览,点击这里升级【资源会员】

情况2:
我们在代码里面,将文件上传到upload目录里面,但是这个时候我们通过类似这样的地址访问:
本帖隐藏的内容需要【资源会员】才可浏览,您需要升级才可浏览,点击这里升级【资源会员】

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

Liferay为什么做?

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

默认时这两个值是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的实现,方法二采用的自己的实现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表