当前位置: 首页 > 图文教程 > 网络编程 > ASP > 时间、空间性能极优的asp无组件上传类

ASP
对连串英文自动换行的解决方法 IE5.5
怎样写你自己的EMAIL组件(原理)
ASP中有关timeout超时的体会
用ASP实现从SQL Server导出数据到Access
ASP向NT域中加一个用户
ASP乱码的解决方法
关于 aspsmartupload 注册问题
利用XML不离开页面刷新数据
IIS 处理 SEARCH 请求漏洞
不用组件实现上载功能(1)
不用组件实现上载功能(2)
在网页中实现OICQ里的头像选择的下拉框
仅用xsl和asp实现分页功能
如何使用context()方法将数据置入表格(XML)
利用ASP从远程服务器上接收XML数据
将数据库里面的内容生成EXCEL
怎样在ASP里面创建统计图表
加密你的Access数据库
利用global.asp定时执行ASP
加密QueryString数据

ASP 中的 时间、空间性能极优的asp无组件上传类


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 128 ::
收藏到网摘: n/a

 

在解码速度方面,化境 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)