posts - 40,  comments - 187,  trackbacks - 0
          問(wèn)題:
          ??????? 后臺(tái)系統(tǒng)通過(guò)FCKeditor上傳圖片或文件到文件系統(tǒng)中,會(huì)把相關(guān)的文件和圖片信息轉(zhuǎn)換為html腳本存放于數(shù)據(jù)庫(kù)的LOB字段中,而圖片或文件存放于磁盤(pán)系統(tǒng)中。假設(shè)外網(wǎng)有一個(gè)應(yīng)用訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù)讀取對(duì)應(yīng)信息時(shí),由于圖片存儲(chǔ)在后臺(tái)應(yīng)用的文件系統(tǒng)中,在網(wǎng)閘的限制下,前臺(tái)的應(yīng)用是無(wú)法訪問(wèn)后臺(tái)的文件系統(tǒng)的。前臺(tái)得不到圖片,這樣圖片就無(wú)法顯示了。

          解決:
          ??????? 在前臺(tái)應(yīng)用和后臺(tái)文件系統(tǒng)間開(kāi)放80端口的情況下,我們可以通過(guò)以下三種方式解決:
          1)通過(guò)重寫(xiě)FCKeditor的SimpleUploaderServlet
          重寫(xiě)的目的是為了將圖片存儲(chǔ)的相對(duì)路徑改為添加IP地址的絕對(duì)路徑訪問(wèn),如:原文件存儲(chǔ)路徑為
          /yourapp/UserFiles/Image/logo.gif
          改為:
          http://202.0.0.7:8080/yourapp/UserFiles/Image/logo.gif
          即添加ip,這樣在前端的應(yīng)用可以通過(guò)80端口訪問(wèn)后臺(tái)文件系統(tǒng)中的圖片。
          缺點(diǎn)是暴露了后臺(tái)應(yīng)用的IP地址,安全性較差。
          ?
          2)通過(guò)Servletfilter來(lái)過(guò)濾URL,監(jiān)聽(tīng)以/UserFiles/開(kāi)頭的路徑,添加ip信息在前面,到達(dá)目的。出于安全性的考慮,這里需要兩級(jí)的Servlet來(lái)過(guò)濾URL。后臺(tái)發(fā)送到前臺(tái)的URL需要添加IP信息以便訪問(wèn)圖片資源,而前臺(tái)應(yīng)用與瀏覽器間需要通過(guò)一個(gè)filter來(lái)將IP信息過(guò)濾掉,從而不會(huì)將IP暴露。
          ?
          3)將圖片或文件以二進(jìn)制形式寫(xiě)入數(shù)據(jù)庫(kù)
          ??? 通過(guò)重寫(xiě)FCKeditor的SimpleUploaderServlet,將圖片或文件以二進(jìn)制形式寫(xiě)入數(shù)據(jù)庫(kù),在前臺(tái)應(yīng)用可以訪問(wèn)數(shù)據(jù)庫(kù)的前提下,讀取數(shù)據(jù)庫(kù),按照記錄的URL,將圖片或文件還原到前臺(tái)的文件系統(tǒng)中。缺點(diǎn)是后臺(tái)圖片或文件更新時(shí),前臺(tái)需要全部還原更新。麻煩點(diǎn)兒的話,在寫(xiě)入數(shù)據(jù)庫(kù)時(shí),可以記錄相對(duì)應(yīng)的業(yè)務(wù)ID,前臺(tái)還原時(shí),只針對(duì)業(yè)務(wù)ID還原。

          我這里采用了第三種方法解決問(wèn)題,具體步驟如下:

          架構(gòu):Hibernate 3.2 + Spring 1.2.8 + struts 1.2.8 + FCKeditor 2.3

          3.1)創(chuàng)建對(duì)象
          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;?
          //附件相對(duì)路徑
          ????
          ????@Column(name
          ="content")
          ????@Lob
          ????
          protected?Blob?content;?//附件實(shí)體
          ????
          ????@Temporal(TemporalType.DATE)
          ????
          private?java.util.Date?createTime;
          ????
          ????
          private?String?createBy;

          ????
          //?省略set&get方法
          ????
          }


          3.2)重寫(xiě)SimpleUploaderServlet
          ??? 重寫(xiě)了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
          ????????????
          //?省略?使用原來(lái)的文件系統(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)并還原圖片
          String?accessoryPath? = ?imageRootPath? + ?accessory.getUrl();
          File?realFile?
          = ? new ?File(accessoryPath);
          if ?( ! realFile.exists())? {? // ?當(dāng)該文件不存在
          ????realFile.mkdirs();? // ?如果文件不存在則創(chuàng)建一個(gè)文件
          ???? 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(
          " 保存文件出錯(cuò)! " );
          ????}
          ????????????
          }



          ???????????????????????????????????????????????????????????????????????????????? THE END
          posted on 2007-09-18 13:22 小立飛刀 閱讀(2166) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): User Interface

          FeedBack:
          # re: 內(nèi)外網(wǎng)共享FCK editor的上傳文件
          2007-09-18 16:57 | 千里冰封
          呵呵,看不太懂  回復(fù)  更多評(píng)論
            
          # re: 內(nèi)外網(wǎng)共享FCK editor的上傳文件
          2007-09-19 02:19 | Alexander.Yu
          好文。。。  回復(fù)  更多評(píng)論
            
          # re: 內(nèi)外網(wǎng)共享FCK editor的上傳文件
          2007-09-19 23:10 | haojunq
          我采用的是第一種方法  回復(fù)  更多評(píng)論
            
          # re: 內(nèi)外網(wǎng)共享FCK editor的上傳文件
          2007-09-20 09:25 | 小立飛刀
          @haojunq
          一開(kāi)始想采用第一種方法的,畢竟省事嘛。但考慮到安全問(wèn)題,還有想記錄下上傳文件的信息,最后采用了第三種。
            回復(fù)  更多評(píng)論
            
          # re: 內(nèi)外網(wǎng)共享FCK editor的上傳文件
          2007-09-20 11:26 | 小立飛刀
          @Alexander.Yu
          客氣了
            回復(fù)  更多評(píng)論
            
          <2007年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          生存或毀滅,這是個(gè)必答之問(wèn)題:是否應(yīng)默默的忍受坎苛命運(yùn)之無(wú)情打擊,還是應(yīng)與深如大海之無(wú)涯苦難奮然為敵,并將其克服。此二抉擇,究竟是哪個(gè)較崇高?

          常用鏈接

          留言簿(12)

          隨筆分類(lèi)(43)

          相冊(cè)

          收藏夾(7)

          朋友的博客

          電子資料

          搜索

          •  

          積分與排名

          • 積分 - 303114
          • 排名 - 193

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 瓦房店市| 奉化市| 遂昌县| 峨眉山市| 黄骅市| 贺兰县| 舞阳县| 连云港市| 桃江县| 米林县| 布拖县| 囊谦县| 临猗县| 冀州市| 司法| 温宿县| 乐清市| 凭祥市| 淮阳县| 陆河县| 广河县| 玉溪市| 莱芜市| 三门县| 额济纳旗| 正定县| 当雄县| 曲阜市| 广宗县| 博湖县| 双流县| 黑龙江省| 浮山县| 衡阳市| 兰坪| 孝昌县| 绿春县| 石泉县| 阳原县| 鹤岗市| 盱眙县|