posts - 40,  comments - 187,  trackbacks - 0
          問題:
          ??????? 后臺系統(tǒng)通過FCKeditor上傳圖片或文件到文件系統(tǒng)中,會把相關(guān)的文件和圖片信息轉(zhuǎn)換為html腳本存放于數(shù)據(jù)庫的LOB字段中,而圖片或文件存放于磁盤系統(tǒng)中。假設(shè)外網(wǎng)有一個應(yīng)用訪問同一個數(shù)據(jù)庫讀取對應(yīng)信息時,由于圖片存儲在后臺應(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地址,安全性較差。
          ?
          2)通過Servletfilter來過濾URL,監(jiān)聽以/UserFiles/開頭的路徑,添加ip信息在前面,到達(dá)目的。出于安全性的考慮,這里需要兩級的Servlet來過濾URL。后臺發(fā)送到前臺的URL需要添加IP信息以便訪問圖片資源,而前臺應(yīng)用與瀏覽器間需要通過一個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)是后臺圖片或文件更新時,前臺需要全部還原更新。麻煩點(diǎn)兒的話,在寫入數(shù)據(jù)庫時,可以記錄相對應(yīng)的業(yè)務(wù)ID,前臺還原時,只針對業(yè)務(wù)ID還原。

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

          架構(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)并還原圖片
          String?accessoryPath? = ?imageRootPath? + ?accessory.getUrl();
          File?realFile?
          = ? new ?File(accessoryPath);
          if ?( ! realFile.exists())? {? // ?當(dāng)該文件不存在
          ????realFile.mkdirs();? // ?如果文件不存在則創(chuàng)建一個文件
          ???? 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 小立飛刀 閱讀(2160) 評論(5)  編輯  收藏 所屬分類: User Interface

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

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

          常用鏈接

          留言簿(12)

          隨筆分類(43)

          相冊

          收藏夾(7)

          朋友的博客

          電子資料

          搜索

          •  

          積分與排名

          • 積分 - 302712
          • 排名 - 192

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 汉中市| 肥乡县| 凤阳县| 会昌县| 新河县| 垦利县| 寿宁县| 鄄城县| 鄂托克前旗| 阳高县| 白沙| 铜梁县| 根河市| 秀山| 偃师市| 普洱| 芒康县| 巴彦县| 岳阳县| 河津市| 泰宁县| 贺州市| 屏东县| 启东市| 雷山县| 秦安县| 海伦市| 扬中市| 曲靖市| 盐池县| 肥乡县| 宣武区| 忻州市| 和田县| 阿克| 临桂县| 进贤县| 和林格尔县| 沙湾县| 百色市| 凤城市|