重明鸟
BlogJava
首页
新随笔
联系
聚合
管理
posts - 40, comments - 187, 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
小立飞刀
阅读(2151)
评论(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新闻
知识库
C++博客
博问
管理
相关文章:
值得推荐的一款原型设计工具-Balsamiq Mockups
易用性的三条原则(转)
如何使用ECSide列表组件构建列表(内附源码)
奇怪的Java.lang.Object@xxx问题
JScript常见错误解释
内外网共享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
生存或毁灭,这是个必答之问题:是否应默默的忍受坎苛命运之无情打击,还是应与深如大海之无涯苦难奋然为敌,并将其克服。此二抉择,究竟是哪个较崇高?
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(12)
给我留言
查看公开留言
查看私人留言
随笔分类
(43)
Database(6)
Hibernate(8)
Java IDE(1)
JavaEE Servers(5)
Javascript
LDAP(4)
Mondrian OLAP(1)
Objective-C
Others(2)
Portal(2)
Spring(6)
User Interface(6)
WebService(1)
XForms(1)
相册
技术图片
收藏夹
(7)
BI in Java(6)
SAP(1)
朋友的博客
目标驱动
小建的博客
电子资料
Hibernate Annotations Reference in Chinese
搜索
积分与排名
积分 - 301876
排名 - 192
最新评论
1. re: 如何同时启动多个Tomcat服务器[未登录]
俩个同样的tomcat,两个同样的jdk这样的配置怎么能,同时启动俩个tomcat。已启动就报jvm,请问如何修改呢?
--小西
2. re: Spring的依赖关系(JAR)
评论内容较长,点击标题查看
--zuidaima
3. re: Java EE十大性能问题
GOOD OPINION
--Sarah Nelson
4. re: Java EE十大性能问题
Very well written.
--Alexia Marthoon
5. re: Java EE十大性能问题
nice post
--Olivia Jennifer
阅读排行榜
1. 如何同时启动多个Tomcat服务器(60408)
2. 又見“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”!(32682)
3. Spring Quartz如何动态配置时间(3)(20671)
4. 使用Hibernate Annotations 维护多对多关系的心得(14587)
5. Tomcat给我的java.lang.OutOfMemoryError: PermGen(14293)
评论排行榜
1. Spring Quartz如何动态配置时间(3)(22)
2. 如何同时启动多个Tomcat服务器(19)
3. 值得推荐的一款原型设计工具-Balsamiq Mockups(15)
4. Quartz Cron Expression(14)
5. 如何使用ECSide列表组件构建列表(内附源码)(10)