posts - 0,  comments - 6,  trackbacks - 0


          監聽文件上傳進度

          如果你希望可以上傳很大的文件,這時,你可能想將上傳的狀態告訴用戶,如已經接收了多少。 

          觀察上傳進度需要通過一個處理監聽器來實現。

          public class UploadProgressListener implements ProgressListener {

          /**

           * pBytesRead,到目前為止已經讀取的字節數 

           * pContentLength,上傳文件的總長度

           * pItems,正在處理第幾個文件項(0 = 一個項目還沒處理, 1 = 第一個項目正在被讀取, ...

           */

          public void update(long pBytesRead, long pContentLength, int pItems) {

          System.out.println("我們正在讀取文件項目 " + pItems);

                  //pContentLength == -1,說明無法得到總數據長度

          if (pContentLength == -1) {

          System.out.println("到目前為止已經讀取了 " + pBytesRead + 字節的數據。");

          else {

          System.out.println("到目前為止已經讀取了" + pContentLength 

          中的 "+ pBytesRead + 字節");

          }

          }

          }

          上面這個監聽器是有問題的。因為它會非常頻繁地被調用。這會帶來性能問題。一個比較好
          的解決辦法是減少調用。如下代碼,為監聽器類增加一個
          kiloBytes實例屬性,其值默認為-1,每當
          pBytesRead/1024的結果變化時(即以KB為單位增加時),將新的計算結果賦值給kiloBytes,然后
          更新上傳進度信息,否則什么都不做,直接返回。這樣就可以減少信息更新的次數。如果上傳的
          文件非常大時,可以將KB單位改為MB,進一步減少信息更新的次數。

          public class UploadProgressListener implements ProgressListener {

          private long kiloBytes = -1;

          /**

           * pBytesRead,到目前為止已經讀取的字節數 

           * pContentLength,上傳文件的總長度

           * pItems,正在處理第幾個文件項(0 = 一個項目還沒處理, 1 = 第一個項目正在被讀取, ...)

           */

          public void update(long pBytesRead, long pContentLength, int pItems) {

          long kBytes = pBytesRead / 1024;// 1KB

          if (kiloBytes == kBytes) {

          return;

          }

          kiloBytes = kBytes;

          System.out.println("我們正在讀取文件項目 " + pItems);

                  //pContentLength == -1,說明無法得到總數據長度

          if (pContentLength == -1) {

          System.out.println("到目前為止已經讀取了 " + pBytesRead + 字節的數據。");

          else {

          System.out.println("到目前為止已經讀取了" + pContentLength 

          中的 "+ pBytesRead + 字節");

          }

          }

          }

              在服務器端,我們只需設計一個對象,將進度信息封裝到這個對象中,再將該對象保存在用戶會
          話中,利用上面示例代碼不斷的更新這個對象的狀態。

              在客戶端,我們可以每隔n秒鐘發起一次ajax請求,到會話中獲取文件上傳進度信息,直到上傳完
          畢。


          鄭州蜂鳥科技有限公司 申林 QQ:38185398  鄭州軟件開發興趣小組群:38236716

          學軟件開發,到蜂鳥科技!超強的師資力量 、完善的課程體系 、超低的培訓價格 、真實的企業項目。

          地址:鄭州市文化路豐產路口東50米豐產路21號SOHO世紀城西塔20樓F
          電話:0371-63839606  手機:13838505572(申老師) 13673990036 (許老師)
          QQ: 1073422643  1群:47614738 2群:108157678 
          網址:www.ntcsoft.com

          posted on 2010-09-03 23:59 whistler 閱讀(1604) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          留言簿(2)

          我參與的團隊

          文章檔案(22)

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 泽库县| 湘乡市| 普陀区| 南溪县| 淅川县| 固原市| 枝江市| 永寿县| 运城市| 夏津县| 叙永县| 江门市| 遂宁市| 淮滨县| 莆田市| 抚远县| 沧源| 勐海县| 浏阳市| 许昌市| 东辽县| 巧家县| 扶风县| 广饶县| 疏勒县| 贵溪市| 昌宁县| 涟源市| 和顺县| 阳东县| 正镶白旗| 广安市| 宾川县| 皮山县| 会昌县| 开平市| 澄江县| 华蓥市| 建水县| 凤冈县| 云南省|