- 主题
- 0
- 积分
- 0
- 贝壳
- 0 个
- 注册时间
- 2006-11-29
- 最后登录
- 2006-11-29
|
IIS6 中ASP上传文件大小限制为200K的问题
通过分析文件头数据,得到文件本地路径,文件名,扩展名,文件类型,表单域名称。并以原文件名将文件保存到服务器。- <%
- Dim ReadBytes,ToRead,Err_Code,strFileData,strUpLoadData
- Dim bCrLf,strSeparator,intSeparator
- Dim File_start,File_end,File_SavePath,strItem,strItemName,intTemp,strTemp
- Dim strFileType,strFileName,strFileExt,LngFilesize
- File_SavePath=""
- ';回车换行符的二进制数据
- bCrLf=ChrB(13)&ChrB(10)
- ReadBytes=0
- ToRead = 200000
- ';建立对象
- Set objStream=Server.CreateObject("ADODB.Stream")
- Set binItem=Server.CreateObject("ADODB.Stream")
- ';指定返回数据类型 adTypeBinary=1,adTypeText=2
- objStream.Type=1
- ';指定打开模式 adModeRead=1,adModeWrite=2,adModeReadWrite=3
- objStream.Mode=3
- objStream.Open
- binBytes=Request.TotalBytes
- if binBytes=0 then
- ';错误输出:没有上传任何数据
- Err_Code=0
- Response.End
- End if
- ';判断提交的数据是否超过限制,如果没有则按原大小读取
- Do while ReadBytes < binBytes
- ';提交的数据或最后一次所取数据可能不足200K,加个判断即可取得精确数据长度
- if ToRead > binBytes-Readbytes then
- ToRead=binBytes-Readbytes
- end if
- objStream.Write Request.BinaryRead(Toread)
- Readbytes=Readbytes+ToRead
- Loop
- ';设置对象指针位置
- objStream.Position=0
- objStream.Type=2
- strUpLoadData=objStream.ReadText
- ';取得分界符的长度
- intSeparator=InstrB(1,strUpLoadData,bCrLf)-1
- ';取得分界符
- strSeparator=LeftB(strUpLoadData,intSeparator)
- ';数据块开始位置=分界符长度加上1个回车符,再加上一个文件块的首字符
- File_start=intSeparator+2
- ';在两个回车符处结束,获得数据头部信息
- File_end =InStrB(File_start,strUpLoadData,bCrLf&bCrLf)+3
- ';指定binItem对象返回的数据为二进制
- binItem.Type=1
- ';打开对象
- binItem.Open
- ';设置objStream对象当前指针位置
- objStream.Position=File_start
- ';将objStream中的第一段数据复制入binItem中
- objStream.CopyTo binItem,File_end-File_start
- binItem.Position=0
- binItem.Type=2
- binItem.Charset="gb2312"
- strItem=binItem.ReadText
- binItem.Close()
- ';下一段数据开始位置
- File_start=File_end
- ';下一块的结束位置,注意要减去一个分界符位
- File_end=InStrB(File_start,strUpLoadData,strSeparator)-1
- binItem.Type=1
- binItem.Open
- ';重置objStream指针位置
- objStream.Position=File_start
- ';数据块长度
- LngFilesize=File_end-File_start-2
- ';将文件数据拷入binItem
- objStream.CopyTo binItem,LngFilesize
- ';以上暂缓
- ';下面进行头部分析工作
- ';39是“Content-Disposition: form-data; name="”的长度,在此后面找到的第一个双引号为表单域名结束
- intTemp=Instr(39,strItem,"""")
- ';取得表单域名
- strItemName=Mid(strItem,39,intTemp-39)
- ';从表单域名后开始查找文件名
- if Instr(intTemp,strItem,"filename=""")<>0 then
- intTemp=intTemp+13
- ';获取文件类型即第一块中“Content-Type: ”的位置+14
- strFileType=Mid(strItem,Instr(intTemp,strItem,"Content-Type: ")+14)
- ';得到文件完整源路径
- strTemp=Mid(strItem,intTemp,Instr(intTemp,strItem,"""")-intTemp)
- intTemp=InstrRev(strTemp,"\")
- ';得到文件名
- strFileName=Mid(strTemp,intTemp+1)
- End if
- ';取得文件扩展名
- if Instr(intTemp,strTemp,".")<>0 then
- strFileExt=Mid(strTemp,InstrRev(strTemp,".")+1)
- else
- strFileExt=""
- end if
- Response.Write "源路径:" & strTemp
- Response.Write "<br>文件名:" & strFileName
- Response.Write "<br>扩展名:" & strFileExt
- Response.Write "<br>文件类型:" & strFileType
- Response.Write "<br>文件大小:" & LngFileSize &"字节"
- Response.Write "<br>表单域名:" & strItemName
- ';储存文件
- binItem.SaveToFile Server.MapPath(File_SavePath&strFileName)
- binItem.close
- objStream.close
- %>
复制代码 以上代码仅实现了单个大文件的上传。其它功能有待扩充。。谢谢关注~! |
|