熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

利用ASP技術實現文件直接上傳功能

2013-11-13 10:32:13  來源: .NET編程 

  引言
  
  采用WEB技術實現B/S(浏覽器/服務器)結構的管理系統是辦公自動化的發展趨勢基於WEB技術的管理系統由於開發周期短與用戶平台無關易於實現交互式應用能對信息進行快速高效的收集處理和發布近幾年來得到了迅速發展而ASP技術由於其開發效率高交互性好安全性強等特點逐漸成為開發管理系統的首選工具
  
  許多基於WEB的應用都涉及文件上傳操作常見的文件上傳技術有基於HTTP協議的基於VB(或DELPHI等編程語言)開發的文件上傳組件的基於數據庫技術的等等這些方法一般都需要編程者能同時掌握WEB技術數據庫技術或CGI技術或組件技術對編程者的要求較高而本文將介紹的利用ASP技術直接實現文件上傳功能則只需編程者掌握單一的ASP技術即可大大降低了編程難度
  
  幾種文件上傳技術的比較
  
  基於HTTP協議
  
  該方法需要編程者利用第三方軟件如DELPHIVB等在應用程序中先進行HTTP協議編程然後將待上傳文件內容按HTTP協議的格式打包最後向WEB服務器發送上傳的請求報文從而實現文件的上傳因為DELPHI和VB不能編寫完整的WEB網絡程序只能編寫WEB小應用程序因此該方法只用於功能受限的網絡應用
  
  基於VB(或DELPHI等)開發的文件上傳組件
  
  該方法利用VB(或DELPHI等編程語言)開發ASP服務器組件實現特定的文件上傳服務它首先利用ASP表單功能將文件(二進制格式)從用戶端上傳到服務器端然後使用VB開發的組件對二進制文件進行處理成為可以正常讀寫的文件該方法要求編程者不僅掌握ASP語言而且還能利用VB等第三方語言進行組件編程增加了開發的難度
  
  基於數據庫技術
  
  該方法和上個方法有類似之處不同的地方在於對上傳的二進制文件的處理上它使用數據庫來保存二進制文件無論是小型數據庫還是大型數據庫都提供了存儲二進制數據的數據類型只要以Append Chunk方式將數據存入相應的字段就可以了該方法雖然簡單可行但是因為每次上傳的文件大小都是不一樣的因此會對數據庫的空間造成很大的浪費降低了數據的訪問速度並且使得文件只能在數據庫環境下進行訪問造成了很大的不便
  
  實例分析
  
  但是利用ASP技術直接實現文件上傳功能則只需編程者掌握單一的ASP技術即可
  
  大大降低了編程難度下面我們將通過一個實例來介紹如何使用該方法
  
  文件上傳表單
  
  首先需要編寫一個能提供文件上傳功能的表單程序如下所示
  
  <Form action=uploadasp method=post enctype=multipart/formdata
  上傳文件<Input type=file name=file><br>
  <input type=submit name=upload value=上傳
  </form>
  
  其中enctype參數用來設置表單的MIME編碼方式在進行文件(或同時包含文本框)上傳時必須將其屬性設置為multipart/formdatauploadasp是服務器端對接收到的二進制文件流進行處理的ASP程序在本文的後面將陸續介紹其內容
  
  上傳文件格式分析
  
  在處理文件之前我們要先了解上傳的文件的具體格式通過編寫下面一段簡單的ASP程序就可以查看其二進制代碼
  
  <%
  filesize=RequestTotalBytes 獲得上傳文件的大小
  filedata=RequestBinaryRead(filesize) 獲得上傳文件的二進制數據
  ResponseBinaryWrite filedata 在浏覽器上顯示二進制數據
  %>
  
  分析浏覽器上顯示的上傳文件的二進制代碼發現代碼包括四個部分(若同時上傳多個文件或文本框則代碼按上傳的先後次序排列格式相同)每一部分的內容是用回車換行符號來進行分隔的
  
  )第一部分(起始標志)
  dbd
  )第二部分(文件說明)
  
  ContentDisposition: formdata; name=file; filename=C:\Documents and Settings\Administrator\My Documents\Invitationdoc ContentType: application/msword
  
  在此我們可以獲得上傳文件的文件名稱及絕對路徑也可以獲得文件類型這些信息是正確保存文件所不可缺少的
  
  )第三部分(文件內容)
  
  即文件的二進制內容
  
  )第四部分(結束標志)
  
  dbd
  
  結合第一部分和第四部分的內容來看dbd(每次上傳數值都不一樣)起到了分割符的作用它標志著一段數據(當有多個上傳內容時)的開始和結束從保存文件所需要的信息來講我們首先需要從第二部分數據的filename中獲得文件名稱然後需要正確定位文件的起始位置最後利用ASP技術將二進制文件用本來的文件名保存即可若同時上傳多個內容(如多個文本框和文件)也是按同樣的方法處理每部分的內容都包含在分割符之中只是文本框和文件的表現形式稍有不同這可以通過具體分析其二進制代碼來了解
  
  利用ASP技術實現文件存儲
  
  上傳文件代碼的處理
  
  ) 獲得分割符代碼
  
  從上面的分析我們已經知道分割符起到了分割多個數據段(包括文本框和各種類型的文件)的重要作用前面已經分析過分割符出現在第一個回車換行符號前因此通過下面這段程序就可獲得分割符代碼
  
  <%
  newline=chrB() & chrB() newline表示二進制的回車符
  filesize=RequestTotalBytes filesize是上傳文件的大小
  filedata=RequestBinaryRead(filesize) filedata是上傳文件的二進制數據
  divider=leftB(filedataclng(instrb(filedatanewline))) divider是分割符
  %>
  
  注因為這裡處理的都是二進制字節碼因此所有的函數都是使用它的二進制版本加了b
  
  ) 獲得文件(或文本框)內容
  
  () 預備函數(將二進制串轉化成字符串)
  
  上傳文件的內容不需要經過二進制向字符串的轉換過程直接保存就可但是若需提取文本框內容或文件的名稱就必須進行轉換因此需要編寫一個通用的並且適用於漢字的轉換函數以下是該函數代碼
  
  Function BtoS (bstr)
  If not Is Null (bstr) Then
  for i = to lenb(bstr)
  bchr = midb(bstri+)
  If ascb(bchr)> Then 漢字是雙字節得兩個字符一起處理
  temp = temp&chr(ascw(midb(bstr i+ )&bchr))
  i = i+
  Else
  temp = temp&chr(ascb(bchr))
  End If
  next
  End If
  BtoS = temp
  End Function
  
  () 獲得文件(或文本框)內容
  
  在實際的WEB應用中上傳操作可能涉及多項內容如多個文本框多個文件等等文件和文本框很好區分文件的數據中包含了filename=字串因此我們寫了如下的通用函數既可用於提取文件內容又可提取文本框內容(需進行二進制轉換)
  
  Function getdata(byval data byval divider final) data表示二進制串divider表示分割符final表示數據的結束位置
  filename=chrb()&chrb()&chrb()&chrb()&chrb()&chrb()&chrb()&chrb()&chrb()&chrb() 字符串filename的二進制表示
  bncrlf=chrb()&chrb() 二進制的回車符
  startpos = instrb(datadivider)+lenb(divider)+lenb(bncrlf) 開始位置
  endpos = instrb(startposdata divider)lenb(bncrlf) 結束位置
  part = midb(data startpos endposstartpos) 兩個分割符之間的內容
  firstline = midb(part instrb(part bncrlf)) 內容之前的說明段
  If (instrb(firstlinefilename)=) Then 若為文本框獲得文本框字符串內容
  stemp=midb(partinstrb(partbncrlf&bncrlf)+lenb(bncrlf&bncrlf)lenb(part)instrb(partbncrlf&bncrlf)+lenb(bncrlf&bncrlf))
  getdata=BtoS(stemp)
  Else 若為文件獲得文件二進制內容
  Getdata=midb (part instrb (part bncrlf&bncrlf)+lenb (bncrlf&bncrlf) lenb (part)
  instrb(partbncrlf&bncrlf)+lenb(bncrlf&bncrlf))
  End If
  Final=endpos
  End function
  
  在程序中直接調用該函數就可獲得所需文件(或文本框)內容如下所示
  
  <%
  Content=getdata (data divider position)
  %>
  
  ) 獲得文件名稱
  前面已經分析過了上傳文件數據流的filename=字段裡包含了文件的名稱和絕對路 徑一般來說我們只需提取出路徑中的文件名即可以下是程序代碼
  
  <%
  namepos=instrrev(BS(firstline)chr()) firstline即上面獲得的說明部分數據chr()
  表示/
  filename=midb(firstlinenamepos+lenb(firstline)namepos) 獲得文件名稱
  %>
  
  利用ASP直接實現文件上傳功能
  
  傳統的ASP程序員只能利用FILESYSTEMOBJECT對象對文本文件(txt)進行移動復制刪除等操作若需處理二進制對象則不得不采用本文前面介紹的那些方法來實現但是現在ASP中的ADOSTREAM對象可以同時操作文本對象和二進制對象(可以在下載)利用它就可
From:http://tw.wingwit.com/Article/program/net/201311/13931.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.