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