最近在做上传自定义图片时出现了一个很奇怪的问题。
我将上传图片的表单放在一个文件(bottom.asp)里,代码如下:
<form name="form2" method="post" action="UpLoad_OK.asp" target="mainFrame" enctype="multipart/form-data" >
<div id="sendpic">
请选择图片:
<input type="file" size=30 />
<input type="button" value="" onClick="JavaScript:form2.submit();" style="background:url(images/sendpic.gif) center no-repeat;height:22px;width:62px;">
</div>
</form>
而UpLoad_OK.asp的代码是这样的:
<!--#include file="inc/func.asp"-->
<%
dim rbk
rbk = upfilepath("pjpeg,gif,bmp,jpg","100000")
%>
UpLoad_OK.asp里调用到了func.asp,此文件里有四个函数:上传文件、将二进制转化为字符串、判断后缀和获取系统当前时间。在上传文件这个函数中,首先先或许文件的大小和它的二进制数据,然后再获取文件的其他信息(文件名开始位置、数据开始位置、数据结束位置等等)。func.asp代码如下:
<%
'函数作用:二进制转换为字符串
'参数
'binarystr:要转换的二进制代码
function changename(binarystr)
for i = 0 to lenb(binarystr) - 1
temp = midb(binarystr,i+1,1)
if ascb(temp)>127 then'汉字是双字节,得两个字符一起处理
changename = changename&chr(ascw(midb(binarystr,i+2,1)&temp))
i = i + 1
else
changename = changename&chr(ascb(temp))
end if
next
end function
'函数作用:判断后缀
'参数
'chkstr:文件后缀
'chktype:允许的后缀,1或者2
function chkpostfix(chkstr,chktype)
tmparr = split(chktype,",")
lennum = ubound(tmparr)
chkpostfix = false
for i=0 to lennum
if chkstr = tmparr(i) then
chkpostfix = true
end if
next
end function
function randname()
Randomize
dtNow=Now()'获取当前系统的日期
randname=year(dtNow) & right("0" & month(dtNow),2) & right("0" & day(dtNow),2) & right("0" & hour(dtNow),2) & right("0" & minute(dtNow),2) & right("0" & second(dtNow),2)
end function
'函数作用:上传文件
'参数
'uptype:上传类型。
'mixbyte:最大字节数
'注:因为这里处理的都是二进制字节码,因此,所有的函数都是使用它的二进制版本,加了"b "。
function upfilepath(uptype,mixbyte)
filesize = request.TotalBytes'表示文件上传的大小
if filesize > mixbyte then
response.Write("<script>alert('上传文件太大');history.go(-1);</script>")
response.End()
end if
filedata = request.BinaryRead(filesize)'返回一个通用变量数组,是上传文件的二进制数据
newline=chrB(13) & chrB(10)'表示二进制的回车符
divider=leftB(filedata,clng(instrb(filedata,newline))-1)'divider是分割符 (一个字符串,在filedata中第一次出现回车符之前的字节的集合)
'文件名开始位置
data1 = instrb(filedata,newline)+2'在filedata中第一次出现换行回车符的位置加2便是文件名开始的位置
'数据开始位置
datastart = instrb(filedata,newline&newline)+4
'数据结束位置
dataend = instrb(datastart,filedata,divider)-len(newline)
''''''''''''''''''''
'这段是我用来测试的
response.write "文件的二进制filedata:"
response.binarywrite filedata
response.write "<br />文件名开始位置 data1:"&data1&"<br />"&"分隔符divider:"
response.binarywrite divider
response.write "<br />数据开始位置datastart:"&datastart&"<br />数据结束位置dataend:"&dataend
'这段是我用来测试的
''''''''''''''''''''
'真正想要的数据
mydata=midb(filedata,datastart,dataend-datastart) '这里是提示出错的地方
'数据长度
num = dataend - datastart
''''''''''''''''''''''''''''''
'获取文件名称
''''''''''''''''''''''''''''''
'字符串“filename="”的二进制形式
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34)
'字符串“Content-Type:”的二进制形式
filetype=chrb(67)&chrb(111)&chrb(110)&chrb(116)&chrb(101)&chrb(110)&chrb(116)&chrb(45)&chrb(84)&chrb(121)&chrb(112)&chrb(101)&chrb(58)
'文件描述信息
namedata = midb(filedata,data1,datastart)
namestart = instrb(namedata,filename)+10
nameend = instrb(namestart+2,namedata,newline)-1
'上传文件名称信息
nametemp = midb(namedata,namestart,nameend-namestart)
'调用转换函数,将二进制转换为字符串
nametemp = changename(nametemp)
'firstline即上面获得的说明部分数据,chr(92) 表示"\"
nametmp=instrrev(nametemp,chr(92))
getname=mid(nametemp,nametmp+1,lenb(nametemp)-nametmp-1) '获得文件名称
'上传文件类型信息
typestart = instrb(namedata,filetype)+13
typeend = instrb(typestart+2,namedata,newline&newline)
'上传文件类型的二进制形式
typetemp = midb(namedata,typestart,typeend-typestart)
'调用转换函数,将二进制转换为字符串
typetemp = changename(typetemp)
'上传文件类型信息 chr(47):/
typetmp = instrrev(typetemp,chr(47))
gettype = mid(typetemp,typetmp+1,lenb(typetemp)-typetmp-1)
'判断文件后缀
if chkpostfix(gettype,uptype) = false then
response.Write("<script>alert('上传类型错误');history.go(-1);</script>")
response.End()
end if
'复制文件
set fromdata = server.CreateObject("adodb.stream")'fromdata为源数据流
fromdata.Mode = 3'设置打开模式,3为可读可写
fromdata.Type = 1'设置数据类型,1为二进制数据
fromdata.Open
set senddata = server.CreateObject("adodb.stream")'senddata为目标数据流
senddata.Mode = 3
senddata.Type = 1
senddata.Open
'文件复制
fromdata.Write filedata'赋值源数据流
'文件开始位置
fromdata.position = datastart-1
'拷贝文件,num为文件长度
fromdata.copyto senddata,num
'保存文件路径
filepath = randname&getname
savepath = server.MapPath(""&left(request.ServerVariables("SCRIPT_NAME"),instrrev(request.ServerVariables("SCRIPT_NAME"),"/")))&"/selfpic/"&filepath
senddata.savetoFile savepath,2'以savepath指定的路径及名称保存文件
senddata.close
set senddata = nothing
fromdata. Close
Set fromdata = nothing
upfilepath = filepath
end function
%>
我的问题:
我上传了一张图片后,显示出这样的答案:
文件名开始位置 data1:48
分隔符divider:-----------------------------20718350314867--
数据开始位置datastart:4
数据结束位置dataend:-1
文件的二进制filedata:-----------------------------20718350314867--(后面没有其他数据!)
Microsoft VBScript 运行时错误 错误 '800a0005'
无效的过程调用或参数: 'midb'
/.../网页聊天室/myChatRoom/inc/func.asp,行 63
从测试结果可以知道,返回的filedata只有一小段,这应该是导致'midb'出错的原因
我将bottom.asp和func.asp独自放到一个文件夹中,将UpLoad_OK.asp中的代码放到func.asp的最末端。上传了同一张图片后,显示结果是这样的:
文件的二进制filedata:-----------------------------71712058022740 Content-Disposition: form-data; name="filename"; filename="20081011094646{554F6F85-2BEB-4392-A0FC-1CCE8551E1C7}.gif" Content-Type: image/gif...这里有一大串数据...-----------------------------71712058022740--
文件名开始位置 data1:46
分隔符divider:-----------------------------71712058022740
数据开始位置datastart:191
数据结束位置dataend:5072
我想知道的是为什么同一个文件会出现这样不同的答案?我换到其他机子里试过了,也是这样的。我也尝试过将文件拷到别的文件夹中,答案还是一样的...
我很迷惑,不知道该怎么解决问题。希望大家可以帮帮我!谢谢了!
应该是路径问题