時間、空間效能極優的asp無組件上傳類

來源:互聯網
上載者:User
上傳|無組件|效能|上傳|無組件|效能 在解碼速度方面,化境 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



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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