程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 在VB中實現文件上傳

在VB中實現文件上傳

編輯:VB綜合教程
VisualBasic作為一個集應用程序開發、測試、查錯功能於一體的集成式開發環境,越來越受到程序員的青睐。筆者在開發某數據庫維護系統的過程中,選擇了VB5.0作為開發平台,Unix作為服務器端操作系統,Informix作為服務器數據庫。
  問題的出現
  在開發該維護系統的過程中,注意到Informix數據庫的字段類型CLOB填入數據時需要函數FILETOCLOB("FILENAME","SERVER"),其中的"FILENAME"需要指出文件路徑和文件名稱。然而,在維護過程中此文件是在客戶端執行的,這樣就要求即時將文件傳輸到服務器端。
  解決辦法
  1.FTP傳輸工具
  我們首先使用FTP傳輸工具,用VB5.0中SHELL命令調用DOS批處理文件來實現傳輸的需要。
  Shell調用格式:
  Shell(pathname[,windowstyle])
  例子:Shell("c:windowsupload.bat")
  批處理文件upload.bat的內容:
  c:windowsftphostname
  username
  password
  sendc:zrhupload.txtupload.txt
  bye
  該命令實現了文件"upload.txt"的傳輸要求。在使用完畢之後,再調用命令把該文件刪除。
  例子:Shell("c:windowsdel_up.bat")
  批處理文件del_up.bat的內容:
  c:windowsftphostname
  username
  password
  deleupload.txt
  bye
  這樣,文件"upload.txt"被刪除。
  但是,另一個問題出現了。由於Shell函數的運行機制是與其它程序同步執行,也就是說,當調用Shell函數的子程序還沒有執行完畢之前,Shell函數後面的語句已經執行。在大批量添加數據的過程中,就會出現某個記錄的文件還沒有傳到,而下一個插入語句(Insert)已經開始調用。這樣,ODBC調用就會出現錯誤。
  2.INET控件
  InternetTransfer控件提供了Internet上最常使用的兩種協議:HTTP和FTP。使用HTTP協議可以連接到WWW服務器上來下載文件;使用FTP協議則可以登錄到FTP服務器。一般的FTP命令,例如CD、GET都可以通過Execute方法實現。
  下面是一個設置INET控件屬性的例子。
  inet1.URL=ftp://username:password@hostname/document
  inet1.Protocol=2-icFTP
  inet1.RemoteHost=hostname
  inet1.RemotePort=21
  inet1.Username=username
  inet1.Password=password
  執行文件傳輸:
  Inet1.Execute"ftp://username:password@hostname",_
  "PUT"&local_filename&"UPLOAD1.TXT"
  right1=Inet1.StillExecuting
  DoWhileright1
   right1=Inet1.StillExecuting
   DoEvents
  Loop
  這樣便實現了文件的上載。
  *SINET控件的優點
  INET控件與Shell()函數的不同之處在於INET控件通過調用語句
  right1=Inet1.StillExecuting
  DoWhileright1
   right1=Inet1.StillExecuting
   DoEvents
  Loop來控制語句執行的順序。在文件傳輸工作未完成之前,程序不會執行其它語句,自然也就不會出現調用Shell函數所出現的問題。變量right1用來測試inet1的執行狀態,如果進程中仍在進行文件傳輸的工作,則調用過程DoEvents給系統空閒時間來做文件傳輸工作,這樣便成功地執行了文件上載的功能。該文件使用完畢之後將被刪除。
  Inet1.Execute"ftp://informix:informix@rd",_
  "DELETEUPLOAD1.TXT"
  right1=Inet1.StillExecuting
  DoWhileright1
  right1=Inet1.StillExecuting
  DoEvents
  Loop
  將上載的文件刪除是為了避免占用服務器端磁盤空間。
  *S利用StateChanged事件提示信息
  服務器在執行inet1.execute的同時也激活了Inet1_StateChanged事件,進程可以根據捕獲到的狀態進行動作。
  object_StateChanged(ByValStateAsInteger)
  State:整數類型Integer
  下面是狀態的說明。
  常數值   描述icNone
  0   未報告狀態icHostResolvingHost
  1   控件正在尋找指定主機的IP地址icHostResolved
  2   控件已成功找到指定主機的IP地址icConnecting
  3   控件正在與指定主機進行連接icConnected
  4   控件已成功與指定主機連接icRequesting
  5   控件正在向主機發出請求icRequestSent
  6   控件已成功向主機發出請求icReceivingResponse
  7   控件正在從主機接收反饋信息icResponseReceived
  8   控件已成功從主機接受反饋信息icDisconnecting
  9   控件正在與主機斷開icDisconnected
  10   控件已與主機斷開icError
  11   在與主機通信的過程中發生了錯誤icResponseCompleted
  12   請求結束且數據已經接收到
  下面是一個例子。
  PrivateSubInet1_StateChanged(ByValStateAsInteger)
  'RetrieveserverresponseusingtheGetChunk
  'methodwhenState=12.Thisexampleassumesthe
  'dataistext.
  SelectCaseState
  '...Othercasesnotshown.
  CaseicResponseReceived'12
  DimvtDataAsVariant'Datavariable.
  DimstrDataAsString:strData=""
  DimbDoneAsBoolean:bDone=False
  'Getfirstchunk.
  vtData=Inet1.GetChunk(1024,icString)
  DoWhileNotbDone
  strData=Data&vtData
  'Getnextchunk.
  vtData=Inet1.GetChunk(1024,icString)
  IfLen(vtData)=0Then
   bDone=True
  EndIf
  Loop
  txtData.Text=strData
  EndSelect
  EndSub->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved