Post large form data to ASP - Request.Form and stack overflow error?MOTOBIT.COM

About | IIS monitor | ASP upload | ASP dictionary | UserManager | Pure ASP upload script | Programming tips
Other articles:
Read and write SQL image data, store binary file to sql table. (WSH, Database, Conversion, VBScript)
Download multiple files in one http request (File & data transfer, VBScript)
Work with binary files in VBSscript - read and write local and remote files (WSH, File & data transfer, Functions, VBScript)
Do you like this article?
Please, rate it
and write review!
Rated:
by Aspin.com users
What do you think?
Areas > Languages > VBScript
Areas > ASP / ASP.Net > Functions > http
Areas > ASP / ASP.Net > File & data transfer
Request object error 'ASP 0107 : 80020009' 

Stack Overflow 

/post/post.asp, line 0 

The data being processed is over the allowed limit. 
      Great message. The ASP limit for FORM data processing (Request.Form) is about 100kB (sometimes 80k, sometimes 105k or similar). You will get the message above if you try to post more data to an ASP page. Grr....
      MS says that The size limit of each form field is exactly 102,399 bytes (Q273482, PRB: "Request object, ASP 0107 (0x80004005)" Error When You Post a Form)
      You can use Huge asp file upload.ASPForm to handle POST requests. Huge asp file upload.ASPForm contains hi-performance, low resources consumption algorithm which can accept up to 2GB of data with multipart (upload) or x-www-form-urlencoded forms.

      But there is a work around for this terrible 'feature' - we can build our own function, which will read binary data from input (x-www-form-urlencoded data) and then we can split the data to fields and decode to text fields. This article contains ASP include, which does the form processing and decoding. You can use it by the next way:
<!--#INCLUDE FILE="_largeform.asp"-->
<Form Method=Post>
  <Input Name=TestField><br>
  <textarea Name=Text ROWS=30 COLS=100>Some laaaarge data</textarea>
<br>
  <Input type=Submit>
</Form>
<%
Dim FormFields
Set FormFields = GetForm

Dim Field
For Each Field In FormFields
  Response.Write "<br>" & Field & ":" & Len(FormFields(Field))
Next
%>
     FormFields has similar functionality as Request.Form - except one. FormFields uses Scripting.Dictionary, so you cannot have two source fields with the same name or multiselect field.
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
'Process of x-www-form-urlencoded POST data
'Using BinaryRead, v1.00
'2001 Antonin Foller, PSTRUH Software, http://www.motobit.com
Function GetForm
  'Dictionary which will store source fields.
  Dim FormFields
  Set FormFields = CreateObject("Scripting.Dictionary")

  'If there are some POST source data
  If Request.Totalbytes>0 And _
    Request.ServerVariables("HTTP_CONTENT_TYPE") = _
    "application/x-www-form-urlencoded" Then

    'Read the data
    Dim SourceData
    SourceData = Request.BinaryRead(Request.Totalbytes)

    'Convert source binary data To a string
    SourceData = RSBinaryToString(SourceData)

    'Form fields are separated by "&"
    SourceData = split(SourceData, "&")
    Dim Field, FieldName, FieldContents
  
    For Each Field In SourceData
      'Field name And contents is separated by "="
      Field = split(Field, "=")
      FieldName = URLDecode(Field(0))
      FieldContents = URLDecode(Field(1))
      'Add field To the dictionary
      FormFields.Add FieldName, FieldContents
    Next
  end if'Request.Totalbytes>0
  Set GetForm = FormFields
End Function

Function URLDecode(ByVal What)
'URL decode Function
'2001 Antonin Foller, PSTRUH Software, http://www.motobit.com
  Dim Pos, pPos

  'replace + To Space
  What = Replace(What, "+", " ")

  on error resume Next
  Dim Stream: Set Stream = CreateObject("ADODB.Stream")
  If err = 0 Then 'URLDecode using ADODB.Stream, If possible
    on error goto 0
    Stream.Type = 2 'String
    Stream.Open

    'replace all %XX To character
    Pos = InStr(1, What, "%")
    pPos = 1
    Do While Pos > 0
      Stream.WriteText Mid(What, pPos, Pos - pPos) + _
        Chr(CLng("&H" & Mid(What, Pos + 1, 2)))
      pPos = Pos + 3
      Pos = InStr(pPos, What, "%")
    Loop
    Stream.WriteText Mid(What, pPos)

    'Read the text stream
    Stream.Position = 0
    URLDecode = Stream.ReadText

    'Free resources
    Stream.Close
  Else 'URL decode using string concentation
    on error goto 0
    'UfUf, this is a little slow method. 
    'Do Not use it For data length over 100k
    Pos = InStr(1, What, "%")
    Do While Pos>0 
      What = Left(What, Pos-1) + _
        Chr(Clng("&H" & Mid(What, Pos+1, 2))) + _
        Mid(What, Pos+3)
      Pos = InStr(Pos+1, What, "%")
    Loop
    URLDecode = What
  End If
End Function


Function RSBinaryToString(Binary)
  'Antonin Foller, http://www.motobit.com
  'RSBinaryToString converts binary data (VT_UI1 | VT_ARRAY)
  'to a string (BSTR) using ADO recordset
  
  Dim RS, LBinary
  Const adLongVarChar = 201
  Set RS = CreateObject("ADODB.Recordset")
  LBinary = LenB(Binary)
  
  If LBinary>0 Then
    RS.Fields.Append "mBinary", adLongVarChar, LBinary
    RS.Open
    RS.AddNew
      RS("mBinary").AppendChunk Binary 
    RS.Update
    RSBinaryToString = RS("mBinary")
  Else
    RSBinaryToString = ""
  End If
End Function
</SCRIPT>

See also

for 'Post large form data to ASP - Request.Form and stack overflow error?' article
URLDecode functionVBS source code to decode URL encoded strings (reverse to Server.URLEncode)
Convert a binary data (BinaryRead) to a string by VBSThis article, demonstrates several versions of source VBS code you can use to work with binary data in ASP and convert the data to a String format.

Copyright and use this code

The source code on this page and other samples at http://www.motobit.com/tips/ are a free code, you can use it as you want: copy it, modify it, use it in your products, ...
If you use this code, please:
1. Leave the author note in the source.
or
2. Link this sample from you page.
<A
 Href="http://www.motobit.com/tips/detpg_largepost/"
 Title="This article shows a way to
	work with request.form fields with
	any size, without 'Stack overflow'
	error."
>Post large form data to ASP - Request.Form and stack overflow error?</A>

© 1996 - 2012 Antonin Foller, Motobit Software | About, Contacts | e-mail: info@pstruh.cz


Partner sites: Search Czech Last minute Zajezdy Obsah na mobil Hry na mobil Java Hry Print-shop Affiliate programy

Kurzy: Akcie | Urad prace | Zakony | Zlato | Firmy | Dane


     IISTracer - IIS ISAPI real-time monitor IISTracer is a real-time monitoring tool for Microsoft IIS, which will show/log you what is happenning on IIS server right now. It let's you reveal problems with long-running scripts (.asp, .cgi, cfm...), hang-up states and low resource situations and lets you stop long-running requests (uploads/downloads).      ActiveX User account Manager - Set of simple objects for creating, deleting, and managing user accounts, groups, servers and domains in the Windows NT environment.
     Active log file - Hi-performance text file logging for ASP/VBS/VBA applications. Lets you create daily/weekly/monthly log files with variable number of logged values and extra timing and performance info.      ActiveX windows registry editor - Intuitive, easy to use COM interface to windows registry. Set of classes to read/enumerate/modify windows registry keys and values from ASP, VBS and T-SQL.
     ActiveX/ASP Multi Dictionary object - Free-threaded hi-speed dictionary algorithm with unique/nonunique keys (map/multimap). Connect to another dictionary object in the same process. Lock and Unlock methods to synchronize tasks (application scope). Share ASP Application/Session objects.      Export DBF/MDB from ASP - Conversion from recordset to MDB/DBF. Direct binary output of MDB or DBF files from ASP pages with one row of code.
     Pure-ASP upload - lets you upload files using Pure ASP VBS code (using multipart/form-data and input type=file).      ByteArray - Works with safearray binary data (VT_UI1 | VT_ARRAY) - save/restore binary data from disk, find, work with code pages, convert to string/hexstring(SQL).
     WebChecker - Checks http, https, ftp and gopher internet connections in regular intervals. Lets you monitor web site functionality (uptime). Enables restart or notification on problems.      HTTPLog ISAPI filter - Lets you log incomming/outgoing http header and document data to separate files. Monitor of IIS service input/output.
Motobit.com