标题:asp无组件上传某个地方不懂
只看楼主
anywa
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-2-10
结帖率:0
已结贴  问题点数:20 回复次数:4 
asp无组件上传某个地方不懂
先看代码,问题在下面

<%'随机命名
function randomname(hzname)
Dim sRnd
Randomize
sRnd = Int(900 * Rnd) + 100
randomname=year(now())&month(now())&day(now())&hour(now()) & minute(now()) & second(now())&sRnd&"."&hzname
end function
%>
</head>
<body>
<%'读取表单信息
'初始化
dim enter,lag,laglen,data,datalen,mdata,mst,msts,mste,sst,ssts,sste,updict,hzname,sdata,oldmname,filename'定义一组变量
set updict=server.CreateObject("Scripting.Dictionary")'创建dictionary对象,用于储存上传后文件的信息
set mst=server.CreateObject("ADODB.Stream")'创建主Stream对象
set sst=server.CreateObject("ADODB.Stream")'创建子Stream对象
enter=chrB(13) & chrB(10)'回车符
mst.type=1'初始化主Stream对象
mst.mode=3
mst.open'打开主Stream对象
mst.write request.BinaryRead(request.TotalBytes)'将表单中的数据传入主Stream对象
mst.position=0'设置主Stream对象的读取初始位置为开头
data=mst.read '读取所有数据存入data变量
datalen=mst.size '获取数据大小
laglen=instrB(data,enter)+1 '标志字符串的长度(包括回车)
lag=leftB(data,laglen-2)'获取标志字符串(包括回车)
msts=laglen '将开始点设置到数据属性段的最前位置
do '循环开始
mste=instrB(msts,data,enter&enter)+3 '设置结束点
sst.type=1'初始化子Stream对象
sst.mode=3
sst.open    '打开子STREAM对象
mst.position=msts '将主Stream数据读取初始位置设置为Msts处
mst.copyto sst,mste-msts '将截取的数据写入副STREAM对象
msts=mste '设置下一个开始点
mste=instrB(msts,data,lag)-3    '设置下一个结束点
sst.position=0 '将子Stream数据读取初始位置设置为开头
sst.type=2 '改变子Stream的类型
sst.charset="gb2312"'设置编码
sdata=sst.readtext '以文本方式读取子STREAM,并存入sdata
ssts=instr(sdata,"filename=""")+10 '在子Stream对象中查找filename=" ,并加上其本身的长度
sste=instrrev(sdata,"""")'在子Stream对象中查找“ ,并加上其本身的长度
oldname=mid(sdata,ssts,sste-ssts)'取得原文件名
hzname=mid(oldname,instr(oldname,".")+1,len(oldname)-instr(oldname,".")) '取得后缀名
sst.close '关闭子Stream
sst.type=1 '重新初始化子Stream
sst.mode=3
sst.open'打开子Stream
mst.position=msts'设置主Stream读取位置
mst.copyto sst,mste-msts'将文件数据从主Stream复制到子Stream
if sst.size>0 then'判断文件内容是否为空,不为空则执行下面部分
filename=randomname(hzname)
sst.savetofile server.MapPath("upfiles")& "\" &filename,2 '存储文件至Upfiles文件夹中并重命名文件
updict.add filename,filename '把文件信息添加入Dictionary对象
end if
sst.close
msts=mste   
loop while msts+laglen+4<datalen '读取结束的条件
if updict.count=0 then    '判断是否有上传文件
response.Write("没有选择任何文件!")
else
for each filename in updict
response.write(updict(filename))
next
end if
'释放实例
mst.close
set updict=nothing
set mst=nothing
set sst=nothing   
%>


这个是在网上找到的ASP无组件上传代码的讲解,有个地方不懂
在第25,26行
laglen=instrB(data,enter)+1 '标志字符串的长度(包括回车)
lag=leftB(data,laglen-2)'获取标志字符串(包括回车)
laglen=instrB(data,enter)+1 这里加的1是chrB(13) & chrB(10)回车符的长度么,对的吧
可是lag=leftB(data,laglen-2)这里为什么要减二呢,减了之后不是把回车符剪掉了么,还把标志字符串也减了一位

第一次发帖子,注册用户要输入五次验证码,呵呵,第一次见到,很喜欢这个论坛,这个才是技术讨论论坛啊
搜索更多相关主题的帖子: dictionary 
2011-02-10 23:54
yms123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:209
帖 子:12488
专家分:19042
注 册:2004-7-17
得分:20 
无组件上传的原理就是把文件的二进制码转换为文本,发到服务器上,然后服务器再把文本转换回二进制码,再存入文件来实现的,因为HTTP数据包里不仅含有要发到服务器的文本,还有其他内容,所以要把文本提取出来。
2011-02-11 11:23
anywa
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-2-10
得分:0 
唉,估计大家现在都很忙了,谁来帮帮我啊
2011-02-11 21:14
yms123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:209
帖 子:12488
专家分:19042
注 册:2004-7-17
得分:0 
我已经解释了,你的那段代码就是分析出二进制代码
2011-02-12 09:49
anywa
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-2-10
得分:0 
laglen=instrB(data,enter)+1 这里加的1是chrB(13) & chrB(10)回车符的长度么,对的吧
可是lag=leftB(data,laglen-2)这里为什么要减二呢,减了之后不是把回车符剪掉了么,还把标志字符串也减了一位



版主哥哥,我这里有疑问啊
2011-02-13 01:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-332030-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.095863 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved