Request.BinaryRead(Request.TotalBytes)抛出大文件的错误

时间:2010-11-17 21:14:20

标签: asp-classic vbscript

我的代码通过POST接受二进制数据并读入一个字节数组。对于大于200 Kb的文件,操作失败。我已经检查了我的sysadmin(我们正在运行IIS 7)以查看我们的配置是否有限制,并且他说没有,并且怀疑它是代码的问题。这里有人看到任何潜在的问题吗?这是我的代码:

Public Sub Initialize
  If Request.TotalBytes > 0 Then
    Dim binData
      binData = Request.BinaryRead(Request.TotalBytes) ' This line fails'
      getData binData
  End If
End Sub


 Private Sub getData(rawData)
    Dim separator 
      separator = MidB(rawData, 1, InstrB(1, rawData, ChrB(13)) - 1)

    Dim lenSeparator
      lenSeparator = LenB(separator)

    Dim currentPos
      currentPos = 1
    Dim inStrByte
      inStrByte = 1
    Dim value, mValue
    Dim tempValue
      tempValue = ""

    While inStrByte > 0
      inStrByte = InStrB(currentPos, rawData, separator)
      mValue = inStrByte - currentPos

      If mValue > 1 Then
        value = MidB(rawData, currentPos, mValue)

        Dim begPos, endPos, midValue, nValue
        Dim intDict
          Set intDict = Server.CreateObject("Scripting.Dictionary")

          begPos = 1 + InStrB(1, value, ChrB(34))
          endPos = InStrB(begPos + 1, value, ChrB(34))
          nValue = endPos

        Dim nameN
          nameN = MidB(value, begPos, endPos - begPos)

        Dim nameValue, isValid
          isValid = True

          If InStrB(1, value, stringToByte("Content-Type")) > 1 Then

            begPos = 1 + InStrB(endPos + 1, value, ChrB(34))
            endPos = InStrB(begPos + 1, value, ChrB(34))

            If endPos = 0 Then
              endPos = begPos + 1
              isValid = False
            End If

            midValue = MidB(value, begPos, endPos - begPos)
              intDict.Add "FileName", trim(byteToString(midValue))

          begPos = 14 + InStrB(endPos + 1, value, stringToByte("Content-Type:"))
          endPos = InStrB(begPos, value, ChrB(13))

            midValue = MidB(value, begPos, endPos - begPos)
              intDict.Add "ContentType", trim(byteToString(midValue))

            begPos = endPos + 4
            endPos = LenB(value)

            nameValue = MidB(value, begPos, ((endPos - begPos) - 1))
          Else
            nameValue = trim(byteToString(MidB(value, nValue + 5)))
          End If

          If isValid = True Then

            intDict.Add "Value", nameValue
            intDict.Add "Name", nameN

            dict.Add byteToString(nameN), intDict
          End If
      End If

      currentPos = lenSeparator + inStrByte
    Wend
  End Sub

以下是日志中出现的错误:

Log Name:      Application    
Source:        Active Server Pages    
Date:          11/11/2010 2:15:35 PM    
Event ID:      5    
Task Category: None    
Level:         Error    
Keywords:      Classic    
User:          N/A    
Computer:      xxxxx.xxxxx.xxx    
Description:    
Error: File /path-to-file/loader.asp Line 36 Operation not Allowed. .    
Event Xml:    
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">    
  <System>    
    <Provider Name="Active Server Pages" />    
    <EventID Qualifiers="49152">5</EventID>    
    <Level>2</Level>    
    <Task>0</Task>    
    <Keywords>0x80000000000000</Keywords>    
    <TimeCreated SystemTime="2010-11-11T19:15:35.000Z" />    
    <EventRecordID>19323</EventRecordID>    
    <Channel>Application</Channel>    
    <Computer>PHSWEB524.partners.org</Computer>    
    <Security />    
  </System>    
  <EventData>    
    <Data>File /mghdev/loader.asp Line 36 Operation not Allowed. </Data>    
  </EventData>    
</Event>

3 个答案:

答案 0 :(得分:33)

默认情况下,POST请求中实体大小的限制为200K,因此您的错误。

您可以增加该限制,打开IIS管理器并将树导航到您的应用程序。双击主面板中的“ASP”图标。展开“限制”类别。将“最大请求实体主体限制”修改为更大的值。

如果这是针对公共网站,请注意您设置的限制,限制的目的是防止恶意POST压倒网站。

答案 1 :(得分:2)

如果您阅读了BinaryRead方法的规范,您将看到该参数实际上也是一个out参数。 BinaryRead方法正在尝试更改它无法执行的Request.TotalBytes的值。 TotalBytes是只读的。

您可以通过将TotalBytes分配给变量并将其传递给变量来轻松解决此问题。这是示例代码在MSDN文档中显示的内容。

如果BinaryRead读取不同数量的数据,该变量将反映读取的大小。

答案 2 :(得分:0)

IIS中“限制属性”部分下需要两个设置

1- 最大请求实体正文限制(请不要以字节为单位)。您必须根据最大文件大小e-g- 40MB(40000000字节)设置该值。

2)-脚本超时。默认值为“ 00:01:30:90秒。根据您的代码运行所需的时间增加它。我将其设置为5分钟,这样就解决了问题。