i am allen
BlogJava
首页
新随笔
联系
聚合
管理
posts - 32, comments - 119, trackbacks - 0
内外网共享FCK editor的上传文件
问题:
后台系统通过FCKeditor上传图片或文件到文件系统中,会把相关的文件和图片信息转换为html脚本存放于数据库的LOB字段中,而图片或文件存放于磁盘系统中。假设外网有一个应用访问同一个数据库读取对应信息时,由于图片存储在后台应用的文件系统中,在网闸的限制下,前台的应用是无法访问后台的文件系统的。前台得不到图片,这样图片就无法显示了。
解决:
在前台应用和后台文件系统间开放80端口的情况下,我们可以通过以下三种方式解决:
1)通过重写FCKeditor的SimpleUploaderServlet
重写的目的是为了将图片存储的相对路径改为添加IP地址的绝对路径访问,如:原文件存储路径为
/yourapp/UserFiles/Image/logo.gif
改为:
http://202.0.0.7:8080/yourapp/UserFiles/Image/logo.gif
即添加ip,这样在前端的应用可以通过80端口访问后台文件系统中的图片。
缺点是暴露了后台应用的IP地址,安全性较差。
2)通过Servletfilter来过滤URL,监听以/UserFiles/开头的路径,添加ip信息在前面,到达目的。出于安全性的考虑,这里需要两级的Servlet来过滤URL。后台发送到前台的URL需要添加IP信息以便访问图片资源,而前台应用与浏览器间需要通过一个filter来将IP信息过滤掉,从而不会将IP暴露。
3)将图片或文件以二进制形式写入数据库
通过重写FCKeditor的SimpleUploaderServlet,将图片或文件以二进制形式写入数据库,在前台应用可以访问数据库的前提下,读取数据库,按照记录的URL,将图片或文件还原到前台的文件系统中。缺点是后台图片或文件更新时,前台需要全部还原更新。麻烦点儿的话,在写入数据库时,可以记录相对应的业务ID,前台还原时,只针对业务ID还原。
我这里采用了第三种方法解决问题,具体步骤如下:
架构:Hibernate 3.2 + Spring 1.2.8 + struts 1.2.8 + FCKeditor 2.3
3.1)创建对象
import
java.sql.Blob;
import
javax.persistence.Column;
import
javax.persistence.Entity;
import
javax.persistence.Lob;
import
javax.persistence.Table;
import
javax.persistence.Temporal;
import
javax.persistence.TemporalType;
import
com.zhjy.frwk.domain.BaseNameObject;
/** */
/**
* 存放上传附件及其描述信息
* Accessory
*
@author
Allen
*/
@SuppressWarnings(
"
serial
"
)
@Entity
@Table(name
=
"
GEA_ACCESSORY
"
)
public
class
Accessory
extends
BaseNameObject
{
//
id, name, desn this three attributes exist in super class
String url;
//
附件相对路径
@Column(name
=
"
content
"
)
@Lob
protected
Blob content;
//
附件实体
@Temporal(TemporalType.DATE)
private
java.util.Date createTime;
private
String createBy;
//
省略set&get方法
}
3.2)重写SimpleUploaderServlet
重写了SimpleUploaderServlet的doPost方法
@SuppressWarnings(
{
"
deprecation
"
,
"
unchecked
"
}
)
public
void
doPost(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException
{
if
(debug) System.out.println(
"
--- BEGIN DOPOST ---
"
);
//
if
(enabled)
{
//
upload to disk file
//
省略 使用原来的文件系统上传
//
upload to database by zhengli 07.09.05
Accessory accessory
=
new
Accessory();
accessory.setName(fileName);
accessory.setDesn(
"
this is a picture!
"
);
accessory.setUrl(fileUrl);
accessory.setCreateBy(
"
DefaultUser
"
);
accessory.setCreateTime(CommonDateUtils.getCalendar().getTime());
Blob pic
=
null
;
FileInputStream in
=
null
;
try
{
String fileLocation
=
currentDirPath
+
"
\\
"
+
fileName;
in
=
new
FileInputStream(fileLocation);
pic
=
Hibernate.createBlob(in);
accessory.setContent(pic);
getAccessoryService().save(accessory);
}
catch
(FileNotFoundException e)
{
_log.error(e.getMessage(), e);
}
catch
(IOException e)
{
_log.error(e.getMessage(), e);
}
finally
{
in.close();
}
}
else
{
retVal
=
"
1
"
;
errorMessage
=
"
This file uploader is disabled. Please check the WEB-INF/web.xml file
"
;
}
//
if
(debug) System.out.println(
"
--- END DOPOST ---
"
);
}
3.3) 还原图片
根据记录的URL建立目录结构并还原图片
String accessoryPath
=
imageRootPath
+
accessory.getUrl();
File realFile
=
new
File(accessoryPath);
if
(
!
realFile.exists())
{
//
当该文件不存在
realFile.mkdirs();
//
如果文件不存在则创建一个文件
try
{
InputStream input
=
accessory.getContent().getBinaryStream();
FileOutputStream output
=
new
FileOutputStream(accessoryPath);
byte
[] b
=
new
byte
[
1024
*
5
];
int
len;
while
((len
=
input.read(b))
!=
-
1
)
{
output.write(b,
0
, len);
}
output.flush();
output.close();
input.close();
}
catch
(Exception e)
{
e.printStackTrace();
logger.error(
"
保存文件出错!
"
);
}
}
THE END
posted on 2007-09-18 13:22
小立飞刀
阅读(1005)
评论(5)
编辑
收藏
所属分类:
User Interface
FeedBack:
#
re: 内外网共享FCK editor的上传文件
2007-09-18 16:57 |
千里冰封
呵呵,看不太懂
回复
更多评论
#
re: 内外网共享FCK editor的上传文件
2007-09-19 02:19 |
Alexander.Yu
好文。。。
回复
更多评论
#
re: 内外网共享FCK editor的上传文件
2007-09-19 23:10 |
haojunq
我采用的是第一种方法
回复
更多评论
#
re: 内外网共享FCK editor的上传文件
2007-09-20 09:25 |
小立飞刀
@haojunq
一开始想采用第一种方法的,毕竟省事嘛。但考虑到安全问题,还有想记录下上传文件的信息,最后采用了第三种。
回复
更多评论
#
re: 内外网共享FCK editor的上传文件
2007-09-20 11:26 |
小立飞刀
@Alexander.Yu
客气了
回复
更多评论
IT新闻
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
相关文章:
奇怪的Java.lang.Object@xxx问题
javascript常见错误解释
内外网共享FCK editor的上传文件
<
2007年9月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
一点很小的善心,乘以13亿,就会变成爱的海洋;
一个很大的困难,除以13亿,都会变得微不足道。
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
(35)
Database(4)
Hibernate(7)
Java IDE(1)
JavaEE Servers(5)
LDAP(4)
Mondrian OLAP(1)
Portal(2)
Spring(6)
User Interface(3)
WebService(1)
XForms(1)
随笔档案
(32)
2008年7月 (1)
2008年5月 (1)
2008年4月 (1)
2008年1月 (1)
2007年12月 (1)
2007年9月 (2)
2007年8月 (4)
2007年7月 (2)
2007年6月 (6)
2007年3月 (5)
2007年1月 (8)
收藏夹
(7)
BI in Java(6)
SAP(1)
朋友的博客
目标驱动
小建的博客
电子资料
Hibernate Annotations Reference in Chinese
最新随笔
1. 应用Spring Portlet MVC开发自己的Portlet(2)
2. 又見“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”!
3. 奇怪的Java.lang.Object@xxx问题
4. 应用Spring Portlet MVC开发自己的Portlet(1)
5. Tomcat给我的java.lang.OutOfMemoryError: PermGen
6. javascript常见错误解释
7. 内外网共享FCK editor的上传文件
8. 怎样去除Oracle数据库中字段的回车换行符
9. 当遇到“数据大小超出此类型的最大值”和“仅可以为插入 LONG 列的 LONG 值赋值”时...
10. 当遇到areasQueries无法装载(Oracle)的错误时...
搜索
积分与排名
积分 - 55893
排名 - 154
最新评论
1. re: 应用Spring Portlet MVC开发自己的Portlet(2)
@qqq
用空补个代码上来 呵呵 最近很忙
--小立飞刀
2. re: 应用Spring Portlet MVC开发自己的Portlet(2)
罗主要是能提供代码让我们看看就好了
--qqq
3. re: javascript常见错误解释
为什么document.body.scrollTop饭回的值老是0啊
--飞龙
4. re: 应用Spring Portlet MVC开发自己的Portlet(1)[未登录]
现在我们公司也在让学习portlet,期待有例子贴出,期待……
--xuan
5. re: Mondrian之初体验
@小白
没遇到过您的问题,看起来应该是缺少Jar包,在www.docjar.com上找找看。
--小立飞刀
阅读排行榜
1. 如何同时启动多个Tomcat服务器(3802)
2. Spring Quartz如何动态配置时间(3)(3313)
3. 又見“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”!(2711)
4. 当遇到“数据大小超出此类型的最大值”和“仅可以为插入 LONG 列的 LONG 值赋值”时...(2500)
5. TransformerFactoryImpl not found exception(2398)
评论排行榜
1. Spring Quartz如何动态配置时间(3)(17)
2. 如何同时启动多个Tomcat服务器(15)
3. Quartz Cron Expression(9)
4. Hibernate3.2中Ehcache的llegalAccessError(8)
5. Mondrian之初体验(7)