上傳|無組件|效能|上傳|無組件|效能 在解碼速度方面,化境 2.0 已經非常高了,但是,它還存在以下兩個問題:
1、用Data_5xsoft.Write Request.BinaryRead(Request.TotalBytes)一次讀取全部資料,以及用RequestData =Data_5xsoft.Read 一次取出全部資料,在上傳資料過大時,會由於記憶體不足,導致上傳失敗,這裡應該採用分段讀取方式。
2、儲存資料時,需要先從Data_5xsoft中複製到一個臨時流中,在儲存大檔案時,需要兩倍的儲存資源,在單機狀態下測試,可以發現儲存時間隨檔案尺寸急劇增長,甚至超過上傳和解碼時間。
本人所寫的這個類,採用在解碼的過程中,逐塊讀取(注意:塊的大小與速度不成正比,單機測試表明,64K的塊比1M的塊快得多)的方法,解決問題1,同時採用對普通資料,寫入工作流程;對檔案內容,直接寫入檔案自身的流的方式,解決問題2。
代碼如下,用法類似於化境:
Server.ScriptTimeOut = 600
Class QuickUpload
Private FForm, FFile, Upload_Stream, ConvertStream
property get Form
set Form = FForm
end property
property get File
set File = FFile
end property
Private Sub Class_Initialize
dim iStart, iEnd, boundary, FieldName, FileName, ContentType, ItemValue, theFile, LineEnd
set FForm=CreateObject("Scripting.Dictionary")
set FFile=CreateObject("Scripting.Dictionary")
set Upload_Stream=CreateObject("Adodb.Stream")
Upload_Stream.mode=3
Upload_Stream.type=1
Upload_Stream.open
set ConvertStream = Server.CreateObject("adodb.stream")
ConvertStream.Mode =3
ConvertStream.Charset="GB2312"
if Request.TotalBytes<1 then Exit Sub
’dStart = CDbl(Time)
’尋找第一個邊界
iStart = Search(Upload_Stream, ChrB(13)&ChrB(10), 1)
’取邊界串
boundary = subString(1, iStart-1, false)
’不是結束邊界,則迴圈
do while StrComp(subString(iStart, 2, false),ChrB(13)&ChrB(10))=0
iStart = iStart+2
’取表單項資訊頭
do while true
iEnd = Search(Upload_Stream, ChrB(13)&ChrB(10), iStart)
’分解資訊頭
line = subString(iStart, iEnd-iStart, true)
’移動位置
iStart = iEnd+2
if Line="" then Exit do
pos = instr(line,":")
if pos>0 then
if StrComp(left(Line,pos-1),"Content-Disposition",1)=0 then
’取表單項名稱
FieldName = ExtractValue(Line,pos+1,"name")
’取檔案名稱
FileName = ExtractValue(Line,pos+1,"filename")
’刪除檔案路徑
FileName = Mid(FileName,InStrRev(FileName, "\")+1)
elseif StrComp(left(Line,pos-1),"Content-Type",1)=0 then
’取檔案類型
ContentType = trim(mid(Line,pos+1))
end if
end if
loop
’取表單項內容
if FileName<>"" then
’建立檔案內容
set theFile = new FileInfo
theFile.Init FileName, ContentType
’檔案流內容移到檔案流中
MoveData Upload_Stream, theFile.Stream, iStart
’上傳資料直接傳入檔案流,可以減少檔案儲存體時間
iEnd = Search(theFile.Stream, boundary, 1)
’後繼資料移入工作流程
MoveData theFile.Stream, Upload_Stream, iEnd-2
’
FFile.add FieldName, theFile
’移動位置
iStart = iStart+2+LenB(boundary)
else
’尋找邊界
iEnd = Search(Upload_Stream, boundary, iStart)
’取表單項內容
ItemValue = subString(iStart, iEnd-2-iStart, true)
’
if FForm.Exists(FieldName) then
FForm.Item(FieldName)&nb