<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    GONE WITH THE WIND

    --tomorrow is another day

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      30 隨筆 :: 19 文章 :: 0 評論 :: 0 Trackbacks
    用delphi和VB實現瀏覽器中超長文件的上傳
     

    摘 要 本文通過delphi的Tihttp控件,將超大文件分割成幾個小文件,通過構造的表單數據流,

                直接發送到接收數據網頁,由vb編寫的服務器端進行文件接收和還原

    一、問題的提出:

    本單位在開發課件生成系統時,需要通過瀏覽器向服務器指定目錄傳送大的音、視頻文件。在微軟asp中未提供相應的控件,asp.net雖然提供了form表單中的file控件進行文件上傳,但對上傳的文件有長度限制,文件長度大于50M上傳會失敗,而微軟基于安全考量,file控件中的文件名在運行期間只讀,這樣利用微軟提供的控件向服務器端上傳長度超過50M的文件變為不可行,必須另劈蹊徑。

    二、解決方案

    delphi以其強大的控件集,快速的RAD開發,深得程序開發人員的青睞,其最新控件集Indy,集成了大部分流行的Internet協議,包括TCPUDPDNSICMPFINGERFTPGOPHERHTTPPOP3SMTPTELNETWHOIS,而瀏覽器的傳輸協議為http。這樣我們可以利用delphi7中的TIHTTP控件,將數據打包后上傳到服務器端。基本思路為:開發兩部分功能程序,一個為ActiveX控件,嵌入到網頁中,負責將客戶端本地上傳文件分解成n個數據包,每個數據包直接編碼成“multipart/form-data”格式的表單信息,依次調用TIhttp控件的post方法向服務器端發送信息。另一個為服務器端的com組件,接受發送過來的原始信息,將數據包拼接還原成文件保存到服務器的指定目錄中。

    三、技術要點:

        1Delyhi 7開發Active X控件要點:選擇新建項目→Active x標簽→Active Form→填入控件名可快速搭建一個Acfire X控件架構,產生一個表單和一個框架代碼文件。

    2.上傳Active x控件設計要點:①表單控件中放置一個編輯控件、三個命令按鈕、一個進度條控件、一個文本標簽控件、一個文件對話框控件。編輯控件用來放置上傳文件名。一個瀏覽按鈕打開文件選擇對話框,選擇上傳文件;進度條控件顯示上傳文件進度;文本標簽顯示上傳文件百分比,取消按鈕可中斷文件上傳。

    ②項目包含兩個代碼文件,其中一個文件用來將上傳文件拆分成小數據包。其關鍵代碼如下:

        for y:=0 to filenum  do

           begin

             if y=0  then   //第一個包

                 begin

                if y <> filenum then

                      begin

                          for i:=1 to basenum do

                            begin

                               read(f,ch);

                               tempf:=chr(ch);

                               temp:=temp+tempf;

                              application.ProcessMessages;

                            end;

                        vflag:=postdata(vurl,vfilename,temp,'0');

                        end

                      else

                             begin

                             j:=0;

                                while not eof(f) do

                                begin

                                  read(f,ch);

                                tempf:=chr(ch);

                                temp:=temp+tempf;

                                j:=j+1;

                                application.ProcessMessages;

                      vflag:=postdata(vurl,vfilename,temp,'-2');

                    end;

                   end

                   else if y<> filenum then //中間包

                       begin

                          for i:=1 to basenum do

                            begin

                               read(f,ch);

                              tempf:=chr(ch);

                               temp:=temp+tempf;

                                application.ProcessMessages;

                            end;

                              vflag:=postdata(vurl,vfilename,temp,'1');

                      end

                   else  //最后一個包

                     begin

                            j:=0;

                            while not eof(f) do

                           begin

                             read(f,ch);

                             tempf:=chr(ch);

                             temp:=temp+tempf;

                             j:=j+1;

                              application.ProcessMessages;

                         end;

                       vflag:=postdata(vurl,vfilename,temp,'-1');

                     end;

           end;

    end;

    ③另一個文件用來將小數據包按照http格式封裝成二進制文件上傳數據流發送到指定的接收頁面(URL),數據流除必要的頭信息,包含兩個表單城,一個數據塊,其中一個表單域用來傳遞文件標記,用來區分本數據包是第一個包,中間包還是最后一個包,另一個表單域傳遞上傳文件名,其關鍵代碼如下:

       try

         filedata.Seek(0,sofrombeginning);

         tempstring:='';

         tempstring:=tempstring+'------------------------------7cf87224d2020a'+

             newline;

         tempstring:=tempstring+'Content-Disposition: form-data;name="vflag"'+newline;

         tempstring:=tempstring+''+newline;

         tempstring:=tempstring+vflag+newline;

         tempstring:=tempstring+''+newline;

         tempstring:=tempstring+''+newline;

         tempstring:=tempstring+'Content-Disposition: form-data; name="editfilename"; filename="'+infile+'"'+newline;

         tempstring:=tempstring+'Content-Type: application/octet-stream'+newline;

         tempstring:=tempstring+''+newline;

         fillchar(temparray,sizeof(temparray),#0);

         strpcopy(temparray,tempstring);

         request.Write(temparray,length(tempstring));

         request.seek(0,sofromend);

         request.CopyFrom(filedata,filedata.size);

         tempstring:='';

         tempstring:=tempstring+''+newline;

         tempstring:=tempstring+'------------------------------7cf87224d2020a--'

              +newline;

         fillchar(temparray,sizeof(temparray),#0);

         strpcopy(temparray,tempstring);

         request.write(temparray,length(tempstring));

         try

           http.Post(url,request,response);

           if pos('成功',response.datastring)<>0 then

              flag:=1

         end.

    End.

    ④本ActiveX控件特色:可以實時顯示上傳進度,并能隨時中斷文件的上傳,上傳頁面畫面如圖所示,可不能隨時中斷文件上傳,即應用程序能隨時從循環語句中跳出,在循環語句中使用了ayydicdition Process Messages語句,該語句用來監聽和處理系統消息這樣就有效避免了文件上傳時,不能進行系統的其它操作。

    3.用VB6.0開發服務器端接收文件的Activeex dll,主要利用VB6.0強大的網頁操作功能,引用庫文件microsoft Active sever Page object library。其中包含有asp對象Asp library request。創建一個接收函數load,使用request對象讀取上傳給接收頁面的二進制數據流,分離出上傳標志、上傳文件名以及文件內容,根據上傳標志將分段傳送來的文件內容拼接成一個完整的文件,保存到指定目錄。

    四、幾點說明

        1.本程序在操作系統為Win98 Win2000的客戶端機器,IIS服務器端為Win 2000的環境下調試通過;

    2.將upfile.htmupload.aspmyget.dllupfileproj1.ocx文件放置到IIS服務之虛擬目錄upfile下(缺省目錄為C:"Inetpub"unnroot"upfile);

    3.修改upfile.htmcodebase屬性(缺省為http://11.68.17.80/upfile/upfileproj1.ocx)中的IP地址為服務器端地址;

    4.修改delphi工程文件upfileprojl中的upfilelmpl1文件中的Button2 click事件中的vulstring=’http://11.68.17.80/upfile/upload.asp’一行數據,將其中的IP地址轉接為服務器端地址,重新編譯后將upfrleprojl.ocx放置到虛擬目錄下;

    5.上傳文件在服務器端的默認保存目錄為c:"temp;

    6.須手工注冊myget.dll,命令語句為regsvr32  C:"inetpub"wwwroot"upfile"myget.dll

    7.覽器中敲擊網站地址執行,缺省地址為http://11.68.17.80/upfile/upfile.htm
    posted on 2009-03-27 08:48 張永耀 閱讀(488) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 久久久亚洲精品无码| 免费播放春色aⅴ视频| 国产亚洲综合成人91精品| eeuss影院免费直达入口| 国产传媒在线观看视频免费观看| 亚洲成AV人片高潮喷水| 国产在线98福利播放视频免费| 亚洲精品第一国产综合亚AV| 国产乱子伦精品免费无码专区 | 久久亚洲AV永久无码精品| 一级黄色免费网站| 国产aⅴ无码专区亚洲av麻豆| 91视频免费观看高清观看完整| 国产成A人亚洲精V品无码性色 | 无码日韩精品一区二区免费暖暖 | 亚洲国产精品日韩av不卡在线 | 一区二区三区免费视频网站| 久久被窝电影亚洲爽爽爽| 日本免费大黄在线观看| 色婷五月综激情亚洲综合| 精品国产免费观看久久久| 男男gay做爽爽的视频免费| 亚洲一区二区三区国产精品| 最近免费字幕中文大全| 亚洲黄色网站视频| 在线观看免费精品国产| 国产区在线免费观看| 亚洲一区二区在线免费观看| www.黄色免费网站| 一本岛v免费不卡一二三区| 亚洲av不卡一区二区三区| 两个人的视频高清在线观看免费| 日韩精品亚洲专区在线影视| 国产精品亚洲一区二区三区在线| 日本高清在线免费| 人妻仑刮八A级毛片免费看| 亚洲AV无码欧洲AV无码网站| 精品国产免费观看一区| 国产精品免费无遮挡无码永久视频| 亚洲一级在线观看| 久久精品国产亚洲Aⅴ蜜臀色欲|