如文件名为 大家“好”啊'a.txt 上传后,结果是“大家”
看一下原因,以稻香老农的化境无组件上传类为例。 假设上传的数据片段如下: --------------------------------- Content-Disposition: form-data; name="text1" Content-Disposition: form-data; name="file1"; filename="E:\大家“好”啊'a.txt" Content-Type: text/plain --------------------------------- 上传类的部分代码如下: --------------------------------- '指向下一个分隔符的起始位置 iFormStart = InStrB(iInfoEnd,RequestData,sStart)
'从Head中取得表单项目名称 iFindStart = InStr(22,sInfo,"name=""",1)+6 iFindEnd = InStr(iFindStart,sInfo,"""",1) sFormName = lcase(Mid (sinfo,iFindStart,iFindEnd-iFindStart))
'如果有"filename=",说明是文件项目 if InStr (45,sInfo,"filename=""",1) > 0 then '将文件名,路径等信息拆分出来,存入objFile集合。 set theFile=new FileInfo 'new了一个FileInfo类的实例 '取得文件名 iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10 iFindEnd = InStr(iFindStart,sInfo,"""",1) sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart) theFile.FileName=getFileName(sFileName) '文件路径 theFile.FilePath=getFilePath(sFileName) '取得文件类型 iFindStart = InStr(iFindEnd,sInfo,"Content-Type: ",1)+14 iFindEnd = InStr(iFindStart,sInfo,vbCr) theFile.FileType =Mid (sinfo,iFindStart,iFindEnd-iFindStart) ---------------------------------
关键在这两句: iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10 iFindEnd = InStr(iFindStart,sInfo,"""",1) 首先查找“filename=”,然后在后面查找双引号。 而此处内容为filename="E:\大家“好”啊'a.txt" 查找到的位置是“大家”后面那个中文双引号。
也就是说,中文双引号与英文双引号,被认为是同义的了。 问题出在Instr函数上。 InStr([start, ]string1, string2[, compare])
'执行文本比较。 response.write instr(1,"abcABC","A",vbTextCompare)
'执行二进制比较 response.write instr(1,"abcABC","A",vbBinaryCompare)
'默认是二进制比较 response.write instr("abcABC","A")
以上代码的输出是144. 二进制比较时,是按字符编码比较,“a”与“A”是不同的。 文本比较时,实际是做了字符是否同义的判断,比如“a”与“A”认为相同。 所以,实际上文本比较要比二进制比较慢一些。
修改办法,将上传类中的所有Instr函数的最后一个参数为1的都改为0即可。 InstrB函数不用修改。
|