利用ASP技術實現檔案直接上傳功能

來源:互聯網
上載者:User
上傳|上傳 摘要: 本文首先比較了幾種常見的檔案上傳技術,然後通過執行個體介紹了利用ASP技術直接實現檔案上傳的具體方法。

  關鍵詞:ASP;檔案上傳;位元據

  引言

  採用WEB技術實現B/S(瀏覽器/伺服器)結構的管理系統是辦公自動化的發展趨勢。基於WEB技術的管理系統,由於開發週期短;與使用者平台無關;易於實現互動式應用;能對資訊進行快速、高效的收集、處理和發布,近幾年來得到了迅速發展。而ASP技術由於其開發效率高、互動性好,安全性強等特點,逐漸成為開發管理系統的首選工具。

  許多基於WEB的應用都涉及檔案上傳操作。常見的檔案上傳技術有:基於HTTP協議的;基於VB(或DELPHI等程式設計語言)開發的檔案上傳組件的;基於資料庫技術的等等。這些方法一般都需要編程者能同時掌握WEB技術、資料庫技術或CGI技術或組件技術,對編程者的要求較高。而本文將介紹的利用ASP技術直接實現檔案上傳功能則只需編程者掌握單一的ASP技術即可,大大降低了編程難度。

  幾種檔案上傳技術的比較

  1、基於HTTP協議

  該方法需要編程者利用第三方軟體,如DELPHI、VB等,在應用程式中先進行HTTP協議編程,然後將待上傳檔案內容按HTTP協議的格式打包,最後向WEB伺服器發送上傳的請求報文,從而實現檔案的上傳。因為DELPHI和VB不能編寫完整的WEB網路程式,只能編寫WEB小應用程式,因此,該方法只用於功能受限的網路應用。

  2、基於VB(或DELPHI等)開發的檔案上傳組件

  該方法利用VB(或DELPHI等程式設計語言)開發ASP伺服器組件,實現特定的檔案上傳服務。它首先利用ASP表單功能將檔案(二進位格式)從使用者端上傳到伺服器端,然後使用VB開發的組件,對二進位檔案進行處理,成為可以正常讀寫的檔案。該方法要求編程者不僅掌握ASP語言,而且還能利用VB等第三方語言進行組件編程,增加了開發的難度。

  3、基於資料庫技術

  該方法和上個方法有類似之處。不同的地方在於對上傳的二進位檔案的處理上。它使用資料庫來儲存二進位檔案。無論是小型資料庫還是大型資料庫都提供了儲存位元據的資料類型,只要以Append Chunk方式將資料存入相應的欄位就可以了。該方法雖然簡單可行,但是因為每次上傳的檔案大小都是不一樣的,因此,會對資料庫的空間造成很大的浪費,降低了資料的訪問速度;並且使得檔案只能在資料庫環境下進行訪問,造成了很大的不便。

  執行個體分析

  但是,利用ASP技術直接實現檔案上傳功能則只需編程者掌握單一的ASP技術即可,

  大大降低了編程難度。下面我們將通過一個執行個體來介紹如何使用該方法。

  1、檔案上傳表單

  首先需要編寫一個能提供檔案上傳功能的表單,程式如下所示:

<Form action="upload.asp" method=post enctype="multipart/form-data">
上傳檔案:<Input type=file name=file1><br>
<input type=submit name=upload value="上傳">
</form>
  其中,enctype參數用來設定表單的MIME編碼方式,在進行檔案(或同時包含文字框)上傳時,必須將其屬性設定為"multipart/form-data";upload.asp是伺服器端對接收到的二進位檔案流進行處理的ASP程式,在本文的後面將陸續介紹其內容。

  2、上傳檔案格式分析

  在處理檔案之前,我們要先瞭解上傳的檔案的具體格式,通過編寫下面一段簡單的ASP程式就可以查看其二進位代碼:

<%
filesize=Request.TotalBytes '獲得上傳檔案的大小
filedata=Request.BinaryRead(filesize) '獲得上傳檔案的位元據
Response.BinaryWrite filedata '在瀏覽器上顯示位元據
%>
  分析瀏覽器上顯示的上傳檔案的二進位代碼,發現程式碼封裝括四個部分(若同時上傳多個檔案或文字框,則代碼按上傳的先後次序排列,格式相同),每一部分的內容是用斷行符號分行符號號來進行分隔的:

  1)第一部分(起始標誌)
  -----------------------------7d329631b04d4
  2)第二部分(檔案說明)

Content-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\Administrator\My Documents\Invitation.doc" Content-Type: application/msword
  在此,我們可以獲得上傳檔案的檔案名稱及絕對路徑,也可以獲得檔案類型。這些資訊是正確儲存檔案所不可缺少的。
  
  3)第三部分(檔案內容)

  即檔案的二進位內容,略。

  4)第四部分(結束標誌)

-----------------------------7d329631b04d4

  結合第一部分和第四部分的內容來看,"-----------------------------7d329631b04d4"(每次上傳,數值都不一樣)起到了分割符的作用,它標誌著一段資料(當有多個上傳內容時)的開始和結束。從儲存檔案所需要的資訊來講,我們首先需要從第二部分資料的"filename"中獲得檔案名稱,然後需要正確定位檔案的起始位置,最後利用ASP技術將二進位檔案用本來的檔案名稱儲存即可。若同時上傳多個內容(如多個文字框和檔案),也是按同樣的方法處理,每部分的內容都包含在分割符之中,只是文字框和檔案的表現形式稍有不同,這可以通過具體分析其二進位代碼來瞭解。
3、利用ASP技術實現檔案儲存體

  上傳檔案代碼的處理

  1) 獲得分割符代碼

  從上面的分析我們已經知道,分割符起到了分割多個資料區段(包括文字框和各種類型的檔案)的重要作用。前面已經分析過,分割符出現在第一個斷行符號分行符號號前。因此,通過下面這段程式就可獲得分割符代碼:

<%
newline=chrB(13) & chrB(10) 'newline表示二進位的斷行符號符
filesize=Request.TotalBytes 'filesize是上傳檔案的大小
filedata=Request.BinaryRead(filesize) 'filedata是上傳檔案的位元據
divider=leftB(filedata,clng(instrb(filedata,newline))-1) 'divider是分割符
%>
  註:因為這裡處理的都是二進位位元組碼,因此,所有的函數都是使用它的二進位版本,加了"b "。

  2) 獲得檔案(或文字框)內容

  (1) 預備函數(將二進位串轉化成字串)

  上傳檔案的內容不需要經過二進位向字串的轉換過程,直接儲存就可。但是,若需提取文字框內容或檔案的名稱,就必須進行轉換。因此,需要編寫一個通用的,並且適用於漢字的轉換函式。以下是該函數代碼:

Function BtoS (bstr)
If not Is Null (bstr) Then
for i = 0 to lenb(bstr) - 1
bchr = midb(bstr,i+1,1)
If ascb(bchr)>127 Then '漢字是雙位元組,得兩個字元一起處理
temp = temp&chr(ascw(midb(bstr, i+2, 1)&bchr))
i = i+1
Else
temp = temp&chr(ascb(bchr))
End If
next
End If
BtoS = temp
End Function
  (2) 獲得檔案(或文字框)內容

  在實際的WEB應用中,上傳操作可能涉及多項內容,如多個文字框、多個檔案等等。檔案和文字框很好區分,檔案的資料中包含了"filename="字串。因此,我們寫了如下的通用函數,既可用於提取檔案內容,又可提取文字框內容(需進行二進位轉換):

Function getdata(byval data, byval divider, final) 'data表示二進位串;divider表示分割符;final表示資料的結束位置
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34) '字串"filename"的二進位表示
bncrlf=chrb(13)&chrb(10) '二進位的斷行符號符
startpos = instrb(data,divider)+lenb(divider)+lenb(bncrlf) ' 開始位置
endpos = instrb(startpos,data, divider)-lenb(bncrlf) '結束位置
part1 = midb(data, startpos, endpos-startpos) '兩個分割符之間的內容
firstline = midb(part1, 1, instrb(part1, bncrlf)-1) ' 內容之前的說明段
If (instrb(firstline,filename)=0) Then '若為文字框,獲得文字框字串內容
stemp=midb(part1,instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf),lenb(part1)-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
getdata=BtoS(stemp)
Else '若為檔案,獲得檔案二進位內容
Getdata=midb (part1, instrb (part1, bncrlf&bncrlf)+lenb (bncrlf&bncrlf), lenb (part1)
-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
End If
Final=endpos
End function
  在程式中直接調用該函數



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.