posts - 40,  comments - 187,  trackbacks - 0
          問題:
          ??????? 后臺系統通過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 小立飛刀 閱讀(2160) 評論(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
          客氣了
            回復  更多評論
            
          <2007年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

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

          常用鏈接

          留言簿(12)

          隨筆分類(43)

          相冊

          收藏夾(7)

          朋友的博客

          電子資料

          搜索

          •  

          積分與排名

          • 積分 - 302745
          • 排名 - 192

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 界首市| 朔州市| 阜南县| 宜丰县| 瓦房店市| 和平县| 平邑县| 鄢陵县| 成都市| 华亭县| 基隆市| 西城区| 垫江县| 陆丰市| 穆棱市| 阳谷县| 巴青县| 濮阳县| 长春市| 宁南县| 温宿县| 鄂州市| 云阳县| 页游| 盘锦市| 滨州市| 正宁县| 紫云| 南通市| 百色市| 会宁县| 木兰县| 商河县| 通州市| 奉贤区| 扎兰屯市| 兴和县| 汉中市| 长顺县| 慈利县| 三门县|