求救大神,关于突然出现的“此键已与该集合的一个元素关联”错误

seraphine1980 2015-12-17 08:53:45
2005年帮单位建设的一个asp+access 网站,主要用于新闻发布,一直都能正常使用,但这几天突然无法进行新闻发布,提示错误:Microsoft VBScript 运行时错误 错误 '800a01c9'

此键已与该集合的一个元素关联

F:\DS2\20110928 备份\ADMIN\../function/upload.asp,行 59

本人将2011年的备份拿出,居然也同样报错,真是百思不得其解,故求大神指点!!!!

附:提示错误的上传文件upload.asp代码

<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT>
Function GetUpload(FormData)
Dim DataStart,DivStr,DivLen,DataSize,FormFieldData
'分隔标志串(+CRLF)
DivStr = LeftB(FormData,InStrB(FormData,str2bin(VbCrLf)) + 1)
'分隔标志串长度
DivLen = LenB(DivStr)
PosOpenBoundary = InStrB(FormData,DivStr)
PosCloseBoundary = InStrB(PosOpenBoundary + 1,FormData,DivStr)
Set Fields = CreateObject("Scripting.Dictionary")

While PosOpenBoundary > 0 And PosCloseBoundary > 0
'name起始位置(name="xxxxx"),加6是因为[name="]长度为6
FieldNameStart = InStrB(PosOpenBoundary,FormData,str2bin("name=")) + 6
FieldNameSize = InStrB(FieldNameStart,FormData,ChrB(34)) - FieldNameStart '(")的ASC值=34
FormFieldName = bin2str(MidB(FormData,FieldNameStart,FieldNameSize))

'filename起始位置(filename="xxxxx")
FieldFileNameStart = InStrB(PosOpenBoundary,FormData,str2bin("filename=")) + 10
If FieldFileNameStart < PosCloseBoundary And FieldFileNameStart > PosopenBoundary Then
FieldFileNameSize = InStrB(FieldFileNameStart,FormData,ChrB(34)) - FieldFileNameStart '(")的ASC值=34
FormFileName = bin2str(MidB(FormData,FieldFileNameStart,FieldFileNameSize))
Else
FormFileName = ""
End If

'Content-Type起始位置(Content-Type: xxxxx)
FieldFileCTStart = InStrB(PosOpenBoundary,FormData,str2bin("Content-Type:")) + 14
If FieldFileCTStart < PosCloseBoundary And FieldFileCTStart > PosOpenBoundary Then
FieldFileCTSize = InStrB(FieldFileCTStart,FormData,str2bin(VbCrLf & VbCrLf)) - FieldFileCTStart
FormFileCT = bin2str(MidB(FormData,FieldFileCTStart,FieldFileCTSize))
Else
FormFileCT = ""
End If

'数据起始位置:2个CRLF开始
DataStart = InStrB(PosOpenBoundary,FormData,str2bin(VbCrLf & VbCrLf)) + 4
If FormFileName <> "" Then
'数据长度,减1是因为数据文件的存取字节数问题(可能是AppendChunk方法的问题):
'由于字节数为奇数的图象存到数据库时会去掉最后一个字符导致图象不能正确显示,
'字节数为偶数的数据文件就不会出现这个问题,因此必须保持字节数为偶数。
DataSize = InStrB(DataStart,FormData,DivStr) - DataStart - 1
FormFieldData = MidB(FormData,DataStart,DataSize)
Else
'数据长度,减2是因为分隔标志串前有一个CRLF
DataSize = InStrB(DataStart,FormData,DivStr) - DataStart - 2
FormFieldData = bin2str(MidB(FormData,DataStart,DataSize))
End If

'建立一个Dictionary集存储Form中各个Field的相关数据
Set Field = CreateUploadField()
Field.Name = FormFieldName
Field.FilePath = FormFileName
Field.FileName = GetFileName(FormFileName)
Field.ContentType = FormFileCT
Field.Length = LenB(FormFieldData)
Field.Value = FormFieldData

Fields.Add FormFieldName, Field

PosOpenBoundary = PosCloseBoundary
PosCloseBoundary = InStrB(PosOpenBoundary + 1,FormData,DivStr)
Wend
Set GetUpload = Fields
End Function

'把二进制字符串转换成普通字符串函数
Function bin2str(binstr)
Dim varlen,clow,ccc,skipflag
'中文字符Skip标志
skipflag=0
ccc = ""
If Not IsNull(binstr) Then
varlen=LenB(binstr)
For i=1 To varlen
If skipflag=0 Then
clow = MidB(binstr,i,1)
'判断是否中文的字符
If AscB(clow) > 127 Then
'AscW会把二进制的中文双字节字符高位和低位反转,所以要先把中文的高低位反转
ccc =ccc & Chr(AscW(MidB(binstr,i+1,1) & clow))
skipflag=1
Else
ccc = ccc & Chr(AscB(clow))
End If
Else
skipflag=0
End If
Next
End If
bin2str = ccc
End Function


'把普通字符串转成二进制字符串函数
Function str2bin(varstr)
str2bin=""
For i=1 To Len(varstr)
varchar=mid(varstr,i,1)
varasc = Asc(varchar)
' asc对中文字符求出来的值可能为负数,
' 加上65536就可求出它的无符号数值
' -1在机器内是用补码表示的0xffff,
' 其无符号值为65535,65535=-1+65536
' 其他负数依次类推。
If varasc<0 Then
varasc = varasc + 65535
End If
'对中文的处理:把双字节低位和高位分开
If varasc>255 Then
varlow = Left(Hex(Asc(varchar)),2)
varhigh = right(Hex(Asc(varchar)),2)
str2bin = str2bin & chrB("&H" & varlow) & chrB("&H" & varhigh)
Else
str2bin = str2bin & chrB(AscB(varchar))
End If
Next
End Function

'取得文件名(去掉Path)
Function GetFileName(FullPath)
If FullPath <> "" Then
FullPath = StrReverse(FullPath)
FullPath = Left(FullPath, InStr(1, FullPath, "\") - 1)
GetFileName = StrReverse(FullPath)
Else
GetFileName = ""
End If
End Function
</SCRIPT>
<SCRIPT RUNAT=SERVER LANGUAGE=JSCRIPT>
function CreateUploadField(){ return new uf_Init() }
function uf_Init(){
this.Name = null
this.FileName = null
this.FilePath = null
this.ContentType = null
this.Value = null
this.Length = null
}
</SCRIPT>

...全文
1102 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
柠檬007 2016-01-18
  • 打赏
  • 举报
回复
卸载补丁"KB3104002"之后问题解决......
柠檬007 2016-01-12
  • 打赏
  • 举报
回复
引用 6 楼 seraphine1980 的回复:
[quote=引用 5 楼 xiaozhi19820323 的回复:] [quote=引用 4 楼 seraphine1980 的回复:] [quote=引用 3 楼 xiaozhi19820323 的回复:] 同求,我也遇到这个错误了,错误主体是说Fields.Add FormFieldName, Field这行name重复了,add进去报的错.实际是FormFieldName根本没有取到值,FieldNameSize = InStrB(FieldNameStart,FormData,ChrB(34)) - FieldNameStart '(")的ASC值=34 取得的值是0,目前还在研究中...求大神给予帮助
这几天都没研究出来是什么情况导致了不能正常使用,郁闷[/quote] 修改了下代码,不用字节直接用字符串,文字都没问题,图片文件什么的是上传不了了.感觉是分号转字节的时候不好使导致的在字节串中找不到位置[/quote] 年底事情太多也没来得及修改调试,ls有没有新进展啊,可曾找到了为啥突然不能用的原因啊[/quote] 找到原因了,是微软更新的一个补丁"KB3104002"存在错误造成的 参考:https://forums.iis.net/p/1229356/2114000.aspx?Re+Windows+Update+breaks+multipart+form+data
baidu_33617057 2016-01-04
  • 打赏
  • 举报
回复
查到错误的地方了,是 FieldNameSize = InStrB(FieldNameStart,FormData,ChrB(34)) - FieldNameStart '(")的ASC值=34 这句,获取不了“的位置,解决办法还没有找到。
cnbjx 2016-01-04
  • 打赏
  • 举报
回复
个人建议换个组件上传或成形的无组件上传类。代码改动不会很大。这样最省时间

几年前写过上传的代码,也算有点经验,假如坚持要自己修改bug,试试以下方法:

1. 将上传表单的信息保存到文件,然后分析 正常上传和错误上传 有何不同
保存 Request.BinaryRead(Request.TotalBytes) 即可

也可用Fiddler提取保存

2. 标准的multipart/form-data格式一般如下:



------WebKitFormBoundarySwJ4q8200emjSLgT
Content-Disposition: form-data; name="text"

text1
------WebKitFormBoundarySwJ4q8200emjSLgT
Content-Disposition: form-data; name="file1"; filename="1.txt"
Content-Type: text/plain

01
------WebKitFormBoundarySwJ4q8200emjSLgT
Content-Disposition: form-data; name="file1"; filename="2.txt"
Content-Type: text/plain

02
------WebKitFormBoundarySwJ4q8200emjSLgT
Content-Disposition: form-data; name="button"

button1
------WebKitFormBoundarySwJ4q8200emjSLgT--



3. 你所排查到的错误 ChrB(34)是双引号获取name值,照理说这个语句不会产生这个错误。获取不到另说。

我在你这步的处理方法是用正则获取,比较快捷。

instrb 2个回车 ChrB(13) & ChrB(10) & ChrB(13) & ChrB(10) 截取Content-Disposition信息,转成文本再正则

正则如下:

Content-Disposition:\s*form-data;\s*name="([^"]+)"(?:\s*;\s*filename="([^"]*)"\s*Content-Type:\s*([a-z0-9/-]+))?




4. 现在写要考虑 file multiple="multiple" 表单了哈。

5. 哈,自己慢慢研究,没源代码只能帮你到这,弄懂了其实原理很简单,就是代码有点繁杂。
想我当年研究这个的时候,还发现流行的无组件无限循环漏洞,收藏库带1000元意外之财。
seraphine1980 2015-12-25
  • 打赏
  • 举报
回复
引用 5 楼 xiaozhi19820323 的回复:
[quote=引用 4 楼 seraphine1980 的回复:] [quote=引用 3 楼 xiaozhi19820323 的回复:] 同求,我也遇到这个错误了,错误主体是说Fields.Add FormFieldName, Field这行name重复了,add进去报的错.实际是FormFieldName根本没有取到值,FieldNameSize = InStrB(FieldNameStart,FormData,ChrB(34)) - FieldNameStart '(")的ASC值=34 取得的值是0,目前还在研究中...求大神给予帮助
这几天都没研究出来是什么情况导致了不能正常使用,郁闷[/quote] 修改了下代码,不用字节直接用字符串,文字都没问题,图片文件什么的是上传不了了.感觉是分号转字节的时候不好使导致的在字节串中找不到位置[/quote] 年底事情太多也没来得及修改调试,ls有没有新进展啊,可曾找到了为啥突然不能用的原因啊
seraphine1980 2015-12-21
  • 打赏
  • 举报
回复
引用 3 楼 xiaozhi19820323 的回复:
同求,我也遇到这个错误了,错误主体是说Fields.Add FormFieldName, Field这行name重复了,add进去报的错.实际是FormFieldName根本没有取到值,FieldNameSize = InStrB(FieldNameStart,FormData,ChrB(34)) - FieldNameStart '(")的ASC值=34 取得的值是0,目前还在研究中...求大神给予帮助
这几天都没研究出来是什么情况导致了不能正常使用,郁闷
柠檬007 2015-12-21
  • 打赏
  • 举报
回复
引用 4 楼 seraphine1980 的回复:
[quote=引用 3 楼 xiaozhi19820323 的回复:] 同求,我也遇到这个错误了,错误主体是说Fields.Add FormFieldName, Field这行name重复了,add进去报的错.实际是FormFieldName根本没有取到值,FieldNameSize = InStrB(FieldNameStart,FormData,ChrB(34)) - FieldNameStart '(")的ASC值=34 取得的值是0,目前还在研究中...求大神给予帮助
这几天都没研究出来是什么情况导致了不能正常使用,郁闷[/quote] 修改了下代码,不用字节直接用字符串,文字都没问题,图片文件什么的是上传不了了.感觉是分号转字节的时候不好使导致的在字节串中找不到位置
柠檬007 2015-12-20
  • 打赏
  • 举报
回复
同求,我也遇到这个错误了,错误主体是说Fields.Add FormFieldName, Field这行name重复了,add进去报的错.实际是FormFieldName根本没有取到值,FieldNameSize = InStrB(FieldNameStart,FormData,ChrB(34)) - FieldNameStart '(")的ASC值=34 取得的值是0,目前还在研究中...求大神给予帮助
seraphine1980 2015-12-19
  • 打赏
  • 举报
回复
关于这个问题,经过这两天反复测试,发现以下奇怪的地方: 1、用xp 32系统,本地iis调试,完全正常;远程服务器操作出现这个问题 2、用64位系统,win7/win10,本地、远程均出现这个问题 这种现象,大约是在12月10日左右出现的,现在在考虑,是不是最近有些什么系统更新导致了这个问题出现。
  • 打赏
  • 举报
回复
用了无组件上传,用set upload=new upload_5xsoft获取类并指定给upload,获取表单数据用的是upload.form("控件名"), 在普通表单提交的时候,如果表单里有同样name的空间,如果用request.form会把他们一起提交到数据库,可是upload.form却不支持此功能,如果有相同name的,就出现上面错误提示! 特别是在提交复选框的时候,因为复选框的name是一样的,就会提示以上错误! 解决方法(针对必须含有相同name的情况,比如必须含有复选框的时候): 1.将文件上传处,即file用iframe单独做,文件上传的数据提交在表单事先提供的一个text里,然后和其他数据一起用request.form提交! 2.将复选框处单独做,可以用iframe或者弹出窗口,最终将结果传递给表单和其他数据一起使用upload.form一起提交!

28,409

社区成员

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

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