对ASP无组件上传比较熟悉的高人进!(或者说对风声无组件上传比较熟)

CainLai 2010-05-12 03:55:50
小弟最近学习无组件上传的源代码,看的是风声无组件上传2.11版本,其中有一截代码不懂,所以来咨询下,问几个问题。
以下是看不懂的源代码部分:

select case strFtyp
case "image/jpeg","image/pjpeg","image/jpg"
if Lcase(strFext)<>"jpg" then strFext="jpg"
m_binItem.Position=3
do while not m_binItem.EOS
do
intTemp = Ascb(m_binItem.Read(1))
loop while intTemp = 255 and not m_binItem.EOS
if intTemp < 192 or intTemp > 195 then
m_binItem.read(Bin2Val(m_binItem.Read(2))-2)
else
Exit do
end if
do
intTemp = Ascb(m_binItem.Read(1))
loop while intTemp < 255 and not m_binItem.EOS
loop
m_binItem.Read(3)
m_dicForm.Add strInam&"_Height",Bin2Val(m_binItem.Read(2))
m_dicForm.Add strInam&"_Width",Bin2Val(m_binItem.Read(2))


先说明下变量的内容:
举个例子,这段代码是上传的数据流中对文件描述的字段:
Content-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\Administrator\My Documents\Invitation.doc" Content-Type: application/msword

其中,strFtyp文件的类型,比如上面字段中的application/msword
strFext是文件的扩展名,比如上面字段中的doc
m_binItem是一个Adodb.Stream对象实例
m_dicForm是一个Scripting.Dictionary对象实例,之前还用来存储了这个文件的一些其他属性,比如路径,大小,类型等
strInam是前一个页面表单中选择文件这一栏的name属性,比如:<Input type=file name=file1>

说明完了,现在开始提出我的问题,有几个地方不懂:

1 Adodb.Stream的copyto这个动作用了以后会不会覆盖之前存储在Adodb.Stream中的内容,具体到这段源代码中,m_binItem之前存储了一次文件的描述字段,后来又存储了一次真正的文件内容,那么这个时候m_binItem中是2个内容都有,还是只有后面的文件内容?

2 具体在这段代码中,他先判断了文件类型(strFtyp)如果是"image/jpeg","image/pjpeg","image/jpg"以后,就强制更改了文件的扩展名(strFext)为jpg,这点是出于什么考虑才这么做呢?

3 m_binItem.Position=3这句看不懂,之前对m_binItem的操作就是把文件的真正内容放到了m_binItem中来,然后他现在把position设置成了3是为什么,看代码应该是受之前判断文件类型(strFtyp)以后才这么做的,这是为什么?还有后面的m_binItem.Read(1)这类的也就不懂了。。。

4 除了case "image/jpeg","image/pjpeg","image/jpg"这一块以外,后面还有几块,分别是:
case "image/gif"
case "image/png"
case "image/bmp"
case "application/x-shockwave-flash"
也分别相应出现了m_binItem.Position=6,m_binItem.Position=18这类的
代码中出现了几个他自己的函数,比如Bin2Val,这些函数的内容我也没看懂,请简单帮我讲下是干什么的:

Private Function BinVal2(bin)
dim lngValue,i
lngValue = 0
for i = lenb(bin) to 1 step -1
lngValue = lngValue *256 + Ascb(midb(bin,i,1))
next
BinVal2=lngValue
End Function

Private Function Bin2Val(bin)
dim lngValue,i
lngValue = 0
for i = 1 to lenb(bin)
lngValue = lngValue *256 + Ascb(midb(bin,i,1))
next
Bin2Val=lngValue
End Function

Private Function Num2Str(num, base, lens)
Dim ret,i
ret = ""
while(num >= base)
i = num Mod base
ret = i & ret
num = (num - i) / base
wend
Num2Str = Right(String(lens, "0") & num & ret, lens)
End Function

Private Function Str2Num(str, base)
Dim ret, i
ret = 0
for i = 1 to Len(str)
ret = ret * base + Cint(Mid(str, i, 1))
next
Str2Num = ret
End Function

问题就这么多,如果是因为我一些基础知识的欠缺导致不好跟我解释的话,那就告诉我应该去看些哪方面的相关内容,谢谢
...全文
171 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CainLai 2010-05-13
  • 打赏
  • 举报
回复
再顶~~~~~~~~~~~~
CainLai 2010-05-13
  • 打赏
  • 举报
回复
有了新的进展 这贴仍然没有人回答,不过已经不重要了,现在结贴
CainLai 2010-05-12
  • 打赏
  • 举报
回复
这几段代码我感觉作用就是判断 如果上传的是这几个类型的图片文件的话,同过这几段代码的处理,可以读出这个图片的高和宽这2个属性,至于Position为什么是6,18这几个数字实在就不懂了,难道是因为如果传的是图片,那么数据流的这几个固定位置就是存放图片的高和宽的属性的?
kaifadi 2010-05-12
  • 打赏
  • 举报
回复
我虽然没看懂,不过我想整个代码你要看懂必须熟悉每一个函数的用法和整体转换的思路!而且我感觉最核心的地方应该就在Adodb.Stream这个对象上!
kaifadi 2010-05-12
  • 打赏
  • 举报
回复
又一个研究代码的深入者,虽然我不太清楚那些代码!不过还是帮顶了!
CainLai 2010-05-12
  • 打赏
  • 举报
回复
LS的回答范围太大了,能不能具体到这段代码中来?
netbaronly2 2010-05-12
  • 打赏
  • 举报
回复
风声就是坨X,看RFC和vbs.chm足够了
CainLai 2010-05-12
  • 打赏
  • 举报
回复
诚心望高人告知啊~~~~~~

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧