問題:
??????? 后臺系統(tǒng)通過FCKeditor上傳圖片或文件到文件系統(tǒng)中,會把相關(guān)的文件和圖片信息轉(zhuǎn)換為html腳本存放于數(shù)據(jù)庫的LOB字段中,而圖片或文件存放于磁盤系統(tǒng)中。假設(shè)外網(wǎng)有一個(gè)應(yīng)用訪問同一個(gè)數(shù)據(jù)庫讀取對應(yīng)信息時(shí),由于圖片存儲在后臺應(yīng)用的文件系統(tǒng)中,在網(wǎng)閘的限制下,前臺的應(yīng)用是無法訪問后臺的文件系統(tǒng)的。前臺得不到圖片,這樣圖片就無法顯示了。
解決:
??????? 后臺系統(tǒng)通過FCKeditor上傳圖片或文件到文件系統(tǒng)中,會把相關(guān)的文件和圖片信息轉(zhuǎn)換為html腳本存放于數(shù)據(jù)庫的LOB字段中,而圖片或文件存放于磁盤系統(tǒng)中。假設(shè)外網(wǎng)有一個(gè)應(yīng)用訪問同一個(gè)數(shù)據(jù)庫讀取對應(yīng)信息時(shí),由于圖片存儲在后臺應(yīng)用的文件系統(tǒng)中,在網(wǎng)閘的限制下,前臺的應(yīng)用是無法訪問后臺的文件系統(tǒng)的。前臺得不到圖片,這樣圖片就無法顯示了。
解決:
??????? 在前臺應(yīng)用和后臺文件系統(tǒng)間開放80端口的情況下,我們可以通過以下三種方式解決:
1)通過重寫FCKeditor的SimpleUploaderServlet
重寫的目的是為了將圖片存儲的相對路徑改為添加IP地址的絕對路徑訪問,如:原文件存儲路徑為
/yourapp/UserFiles/Image/logo.gif
改為: http://202.0.0.7:8080/yourapp/UserFiles/Image/logo.gif
即添加ip,這樣在前端的應(yīng)用可以通過80端口訪問后臺文件系統(tǒng)中的圖片。
缺點(diǎn)是暴露了后臺應(yīng)用的IP地址,安全性較差。
1)通過重寫FCKeditor的SimpleUploaderServlet
重寫的目的是為了將圖片存儲的相對路徑改為添加IP地址的絕對路徑訪問,如:原文件存儲路徑為
/yourapp/UserFiles/Image/logo.gif
改為: http://202.0.0.7:8080/yourapp/UserFiles/Image/logo.gif
即添加ip,這樣在前端的應(yīng)用可以通過80端口訪問后臺文件系統(tǒng)中的圖片。
缺點(diǎn)是暴露了后臺應(yīng)用的IP地址,安全性較差。
?
2)通過Servletfilter來過濾URL,監(jiān)聽以/UserFiles/開頭的路徑,添加ip信息在前面,到達(dá)目的。出于安全性的考慮,這里需要兩級的Servlet來過濾URL。后臺發(fā)送到前臺的URL需要添加IP信息以便訪問圖片資源,而前臺應(yīng)用與瀏覽器間需要通過一個(gè)filter來將IP信息過濾掉,從而不會將IP暴露。
?
3)將圖片或文件以二進(jìn)制形式寫入數(shù)據(jù)庫
??? 通過重寫FCKeditor的SimpleUploaderServlet,將圖片或文件以二進(jìn)制形式寫入數(shù)據(jù)庫,在前臺應(yīng)用可以訪問數(shù)據(jù)庫的前提下,讀取數(shù)據(jù)庫,按照記錄的URL,將圖片或文件還原到前臺的文件系統(tǒng)中。缺點(diǎn)是后臺圖片或文件更新時(shí),前臺需要全部還原更新。麻煩點(diǎn)兒的話,在寫入數(shù)據(jù)庫時(shí),可以記錄相對應(yīng)的業(yè)務(wù)ID,前臺還原時(shí),只針對業(yè)務(wù)ID還原。
我這里采用了第三種方法解決問題,具體步驟如下:
架構(gòu):Hibernate 3.2 + Spring 1.2.8 + struts 1.2.8 + FCKeditor 2.3
架構(gòu):Hibernate 3.2 + Spring 1.2.8 + struts 1.2.8 + FCKeditor 2.3
3.1)創(chuàng)建對象
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;?//附件實(shí)體
????
????@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
????????????//
?省略?使用原來的文件系統(tǒng)上傳
????????????//?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) 還原圖片
??????? 根據(jù)記錄的URL建立目錄結(jié)構(gòu)并還原圖片
??????? 根據(jù)記錄的URL建立目錄結(jié)構(gòu)并還原圖片




























???????????????????????????????????????????????????????????????????????????????? THE END