file size limit in Response.binarywrite

Discussion in 'ASP General' started by S N, Sep 7, 2008.

  1. S N

    S N Guest

    I am using the following code to hide the download url of files on my website. The code uses Response.Binarywrite to send file to the client.
    Kindly indicate the maximum size of the file that can be downloaded using this method.
    I am hosting this site on a public server, so I will not be able to change anything on the webserver. Kindly indicate what can be done to ensure that the above method remains valid for any file size download.

    call Response.AddHeader("Content-Disposition","attachment; filename=""" & strFileSave & """")
    Response.ContentType = "bad/type"
    Set Fsys = Server.CreateObject("Scripting.FileSystemObject")
    Set TS = Fsys.GetFile(strFile).OpenAsTextStream(1, -1)
    Do While Not (TS.AtEndOfStream)
    Response.BinaryWrite(TS.Read(1))
    Loop
    S N, Sep 7, 2008
    #1
    1. Advertising

  2. S N

    Old Pedant Guest

    "S N" wrote:

    > I am using the following code to hide the download url of files on my website. The code uses Response.Binarywrite to send file to the client.
    > Kindly indicate the maximum size of the file that can be downloaded using this method.
    > call Response.AddHeader("Content-Disposition","attachment; filename=""" & strFileSave & """")
    > Response.ContentType = "bad/type"
    > Set Fsys = Server.CreateObject("Scripting.FileSystemObject")
    > Set TS = Fsys.GetFile(strFile).OpenAsTextStream(1, -1)
    > Do While Not (TS.AtEndOfStream)
    > Response.BinaryWrite(TS.Read(1))
    > Loop


    Ummm...that code isn't goint to work, anyway. See the method
    OpenAsTEXTstream
    ???

    You really can only use FileSystemObject reliably with text files; it wasn't
    designed to work with binary files.

    You need to use ADODB.Stream object, instead.
    http://msdn.microsoft.com/en-us/library/ms675032(VS.85).aspx

    And then you could easily control the amount you write in each chunk by just
    limiting the amount you Read each time.
    Old Pedant, Sep 8, 2008
    #2
    1. Advertising

  3. S N

    S N Guest

    Thanks for the advice. I was under the impression that ADODB can be used
    only for databases. This is the first instance of using it on files.
    Can you please provide a sample code to hide download url by using ADODB
    stream, while there should be no limit on the size of files to be
    downloaded.

    ..
    "Old Pedant" <> wrote in message
    news:...
    > "S N" wrote:
    >
    >> I am using the following code to hide the download url of files on my
    >> website. The code uses Response.Binarywrite to send file to the client.
    >> Kindly indicate the maximum size of the file that can be downloaded using
    >> this method.
    >> call Response.AddHeader("Content-Disposition","attachment; filename=""" &
    >> strFileSave & """")
    >> Response.ContentType = "bad/type"
    >> Set Fsys = Server.CreateObject("Scripting.FileSystemObject")
    >> Set TS = Fsys.GetFile(strFile).OpenAsTextStream(1, -1)
    >> Do While Not (TS.AtEndOfStream)
    >> Response.BinaryWrite(TS.Read(1))
    >> Loop

    >
    > Ummm...that code isn't goint to work, anyway. See the method
    > OpenAsTEXTstream
    > ???
    >
    > You really can only use FileSystemObject reliably with text files; it
    > wasn't
    > designed to work with binary files.
    >
    > You need to use ADODB.Stream object, instead.
    > http://msdn.microsoft.com/en-us/library/ms675032(VS.85).aspx
    >
    > And then you could easily control the amount you write in each chunk by
    > just
    > limiting the amount you Read each time.
    >
    S N, Sep 8, 2008
    #3
  4. S N

    Old Pedant Guest

    Old Pedant, Sep 8, 2008
    #4
  5. S N

    S N Guest

    I would be grateful if you can give me vbscript code as well.
    I would also like to clarify that the code for jscript forces save as
    dialog. What if we want to hide the download url but dont want to force the
    save as dialog, instead just want to see the pdf file within the browser
    window itself.
    Kindly advise on this.

    Thanks in anticipation.

    "Old Pedant" <> wrote in message
    news:...
    >
    >
    > "S N" wrote:
    >
    >> Can you please provide a sample code to hide download url by using ADODB
    >> stream, while there should be no limit on the size of files to be
    >> downloaded.

    >
    > Good old Atrax has a couple of demos.
    >
    > Note that his code is written in JScript for ASP, but conversion to
    > VBScript
    > should be easy.
    >
    > http://rtfm.atrax.co.uk/infinitemonkeys/articles/asp/934.asp
    > and
    > http://rtfm.atrax.co.uk/infinitemonkeys/articles/asp/935.asp
    >
    > If you need more help, ask.
    >
    S N, Sep 9, 2008
    #5
  6. "S N" <> wrote in message
    news:...
    >I am using the following code to hide the download url of files on my
    >website. The code uses Response.Binarywrite to send file to the >client.
    >Kindly indicate the maximum size of the file that can be downloaded using
    >this method.
    >I am hosting this site on a public server, so I will not be able to change
    >anything on the webserver. Kindly indicate what can be done to >ensure that
    >the above method remains valid for any file size download.
    >
    >call Response.AddHeader("Content-Disposition","attachment; filename=""" &
    >strFileSave & """")
    > Response.ContentType = "bad/type"
    > Set Fsys = Server.CreateObject("Scripting.FileSystemObject")
    > Set TS = Fsys.GetFile(strFile).OpenAsTextStream(1, -1)
    > Do While Not (TS.AtEndOfStream)
    > Response.BinaryWrite(TS.Read(1))
    > Loop


    Use this code:-

    Sub SendFileToResponse(FilePath, FileName)

    Const clChunkSize = 1048576 ' 1MB

    Dim oStream, i
    Response.Buffer = False

    Response.ContentType = "application/octet-stream"
    Response.AddHeader "Content-Disposition", _
    "attachment; Filename=" & FileName

    Set oStream = Server.CreateObject("ADODB.Stream")
    oStream.Type = 1 ' Binary
    oStream.Open
    oStream.LoadFromFile FilePath

    For i = 1 To oStream.Size \ clChunkSize
    Response.BinaryWrite oStream.Read(clChunkSize)
    Next
    If (oStream.Size Mod clChunkSize) <> 0 Then
    Response.BinaryWrite oStream.Read(oStream.Size Mod clChunkSize)
    End If
    oStream.Close

    End Sub

    SendFileToResponse strFile, strFileSave

    Note the Response.Buffer = false allows you to send a file of any size.

    --
    Anthony Jones - MVP ASP/ASP.NET
    Anthony Jones, Sep 9, 2008
    #6
  7. S N

    S N Guest

    What if we want to use sendfiletoresponse but dont want to force the save as
    dialog, instead just want to see the pdf file within the browser window
    itself.
    is there any change required in the code to achieve this.

    "Anthony Jones" <> wrote in message
    news:...
    >
    > "S N" <> wrote in message
    > news:...
    >>I am using the following code to hide the download url of files on my
    >>website. The code uses Response.Binarywrite to send file to the >client.
    >>Kindly indicate the maximum size of the file that can be downloaded using
    >>this method.
    >>I am hosting this site on a public server, so I will not be able to change
    >>anything on the webserver. Kindly indicate what can be done to >ensure
    >>that the above method remains valid for any file size download.
    >>
    >>call Response.AddHeader("Content-Disposition","attachment; filename=""" &
    >>strFileSave & """")
    >> Response.ContentType = "bad/type"
    >> Set Fsys = Server.CreateObject("Scripting.FileSystemObject")
    >> Set TS = Fsys.GetFile(strFile).OpenAsTextStream(1, -1)
    >> Do While Not (TS.AtEndOfStream)
    >> Response.BinaryWrite(TS.Read(1))
    >> Loop

    >
    > Use this code:-
    >
    > Sub SendFileToResponse(FilePath, FileName)
    >
    > Const clChunkSize = 1048576 ' 1MB
    >
    > Dim oStream, i
    > Response.Buffer = False
    >
    > Response.ContentType = "application/octet-stream"
    > Response.AddHeader "Content-Disposition", _
    > "attachment; Filename=" & FileName
    >
    > Set oStream = Server.CreateObject("ADODB.Stream")
    > oStream.Type = 1 ' Binary
    > oStream.Open
    > oStream.LoadFromFile FilePath
    >
    > For i = 1 To oStream.Size \ clChunkSize
    > Response.BinaryWrite oStream.Read(clChunkSize)
    > Next
    > If (oStream.Size Mod clChunkSize) <> 0 Then
    > Response.BinaryWrite oStream.Read(oStream.Size Mod clChunkSize)
    > End If
    > oStream.Close
    >
    > End Sub
    >
    > SendFileToResponse strFile, strFileSave
    >
    > Note the Response.Buffer = false allows you to send a file of any size.
    >
    > --
    > Anthony Jones - MVP ASP/ASP.NET
    >
    >
    S N, Sep 9, 2008
    #7
  8. "S N" <> wrote in message
    news:%23$...
    > What if we want to use sendfiletoresponse but dont want to force the save
    > as dialog, instead just want to see the pdf file within the browser window
    > itself.
    > is there any change required in the code to achieve this.
    >


    If you know its a pdf then change content-type to application/pdf and remove
    the attachment; keyword from content-disposition.

    --
    Anthony Jones - MVP ASP/ASP.NET
    Anthony Jones, Sep 9, 2008
    #8
  9. S N

    S N Guest

    Following error received:

    Response object error 'ASP 0157 : 80004005'
    Buffering On

    /test/dl.asp, line 2

    Buffering cannot be turned off once it is already turned on.


    Please note that I am hosting the site on a public server so there is no way
    to ask the web admin to configure the server specifically for me. In such a
    situation is it possible to eliminate the error as indicated above. Further,
    if I am not able to switch off the response.buffer, will there be any
    limitation on the size of file that i can download using
    response.binarywrite?




    "Anthony Jones" <> wrote in message
    news:...
    > "S N" <> wrote in message
    > news:%23$...
    >> What if we want to use sendfiletoresponse but dont want to force the save
    >> as dialog, instead just want to see the pdf file within the browser
    >> window itself.
    >> is there any change required in the code to achieve this.
    >>

    >
    > If you know its a pdf then change content-type to application/pdf and
    > remove the attachment; keyword from content-disposition.
    >
    > --
    > Anthony Jones - MVP ASP/ASP.NET
    >
    >
    S N, Sep 9, 2008
    #9
  10. S N

    S N Guest

    Also advise the content type in case the file is an excel file, word
    document, exe file, zip file etc.

    Thanks in advance.


    "Anthony Jones" <> wrote in message
    news:...
    > "S N" <> wrote in message
    > news:%23$...
    >> What if we want to use sendfiletoresponse but dont want to force the save
    >> as dialog, instead just want to see the pdf file within the browser
    >> window itself.
    >> is there any change required in the code to achieve this.
    >>

    >
    > If you know its a pdf then change content-type to application/pdf and
    > remove the attachment; keyword from content-disposition.
    >
    > --
    > Anthony Jones - MVP ASP/ASP.NET
    >
    >
    S N, Sep 9, 2008
    #10
  11. "S N" <> wrote in message
    news:...
    > Following error received:
    >
    > Response object error 'ASP 0157 : 80004005'
    > Buffering On
    >
    > /test/dl.asp, line 2
    >
    > Buffering cannot be turned off once it is already turned on.
    >


    You get this error if there is anything in your page or includes at the top
    of the page which writes stuff to the response before your code has run.
    Note any static content in the page will be sent.

    Typical a page of this sort looks like:-

    <!-- #include .... some common include -->
    <%

    ' Code here that should note writing anything.
    'My code I posted to you with your mods.
    %>

    Where the include is of a similar structure defininng constants and utility
    functions.

    >
    > Please note that I am hosting the site on a public server so there is no
    > way to ask the web admin to configure the server specifically for me.


    Whilst an admin may have configured the buffer to be on (which is the
    default) you can set it off as long as you do so before sending anything.

    >In such a situation is it possible to eliminate the error as indicated
    >above. Further, if I am not able to switch off the response.buffer, will
    >there be any limitation on the size of file that i can download using
    >response.binarywrite?
    >


    Without turning it off there will be a limitation. The is a buffer size
    limit that a public server administrator will almost certainly have
    configured (the default on IIS6 is 4MB).

    --
    Anthony Jones - MVP ASP/ASP.NET
    Anthony Jones, Sep 9, 2008
    #11
  12. "S N" <> wrote in message
    news:...
    > Also advise the content type in case the file is an excel file, word
    > document, exe file, zip file etc.
    >


    Try Google: mime type xxx where xxx = doc, exe etc.

    --
    Anthony Jones - MVP ASP/ASP.NET
    Anthony Jones, Sep 9, 2008
    #12
  13. S N

    S N Guest

    Got it. But now a new problem.
    When I place <%Response.Buffer=False%> as the first line of my asp file, no
    file is downloaded and no message comes.
    However, when I delete the <%Response.Buffer=False%> line then the file
    downloads as expected.

    Please advise.

    "Anthony Jones" <> wrote in message
    news:OOx$...
    > "S N" <> wrote in message
    > news:...
    >> Also advise the content type in case the file is an excel file, word
    >> document, exe file, zip file etc.
    >>

    >
    > Try Google: mime type xxx where xxx = doc, exe etc.
    >
    > --
    > Anthony Jones - MVP ASP/ASP.NET
    >
    >
    S N, Sep 9, 2008
    #13
  14. S N

    S N Guest

    Also I am linking the download code from another file. When I run the
    download code without referring to it from another file, it runs. But When I
    refer it from another file and it has <%Response.Buffer=False%> line, then I
    get the message
    Response object error 'ASP 0156 : 80004005'

    Header Error

    /test/dl.asp, line 114

    The HTTP headers are already written to the client browser. Any HTTP header
    modifications must be made before writing page content.



    Please help



    "Anthony Jones" <> wrote in message
    news:OOx$...
    > "S N" <> wrote in message
    > news:...
    >> Also advise the content type in case the file is an excel file, word
    >> document, exe file, zip file etc.
    >>

    >
    > Try Google: mime type xxx where xxx = doc, exe etc.
    >
    > --
    > Anthony Jones - MVP ASP/ASP.NET
    >
    >
    S N, Sep 9, 2008
    #14
  15. S N

    S N Guest

    I got it finally. Thanks.
    Just one clarification
    You intended
    For i = 1 To oStream.Size / clChunkSize

    or

    For i = 1 To oStream.Size \ clChunkSize

    Please clarify.


    "S N" <> wrote in message
    news:...
    > Also I am linking the download code from another file. When I run the
    > download code without referring to it from another file, it runs. But When
    > I refer it from another file and it has <%Response.Buffer=False%> line,
    > then I get the message
    > Response object error 'ASP 0156 : 80004005'
    >
    > Header Error
    >
    > /test/dl.asp, line 114
    >
    > The HTTP headers are already written to the client browser. Any HTTP
    > header modifications must be made before writing page content.
    >
    >
    >
    > Please help
    >
    >
    >
    > "Anthony Jones" <> wrote in message
    > news:OOx$...
    >> "S N" <> wrote in message
    >> news:...
    >>> Also advise the content type in case the file is an excel file, word
    >>> document, exe file, zip file etc.
    >>>

    >>
    >> Try Google: mime type xxx where xxx = doc, exe etc.
    >>
    >> --
    >> Anthony Jones - MVP ASP/ASP.NET
    >>
    >>

    >
    >
    >
    S N, Sep 9, 2008
    #15
  16. S N

    Old Pedant Guest

    "S N" wrote:

    > Just one clarification
    > You intended
    > For i = 1 To oStream.Size / clChunkSize
    > or
    > For i = 1 To oStream.Size \ clChunkSize


    He *intended* the latter.

    The backslash operator means "integer division" in VBScript (and VB and
    VB.NET) code.

    That is,
    a \ b
    is equivalent to
    INT( a / b )

    ********************

    Also, you don't need to mess with Response.Buffer=False, at all.

    Just follow each
    Response.BinaryWrite
    with
    Response.Flush

    Now the buffer will never get more full than one "chunkSize".
    Old Pedant, Sep 10, 2008
    #16
  17. "Old Pedant" <> wrote in message
    news:...
    >
    >
    > "S N" wrote:
    >
    >> Just one clarification
    >> You intended
    >> For i = 1 To oStream.Size / clChunkSize
    >> or
    >> For i = 1 To oStream.Size \ clChunkSize

    >
    > He *intended* the latter.
    >
    > The backslash operator means "integer division" in VBScript (and VB and
    > VB.NET) code.
    >
    > That is,
    > a \ b
    > is equivalent to
    > INT( a / b )
    >
    > ********************
    >
    > Also, you don't need to mess with Response.Buffer=False, at all.
    >
    > Just follow each
    > Response.BinaryWrite
    > with
    > Response.Flush
    >
    > Now the buffer will never get more full than one "chunkSize".
    >


    Yes that would work. However it would mask unintended errors that turning
    the buffer off right at the top of the code exposes.

    --
    Anthony Jones - MVP ASP/ASP.NET
    Anthony Jones, Sep 10, 2008
    #17
  18. S N

    S N Guest

    "Anthony Jones" <> wrote in message
    news:...
    > "Old Pedant" <> wrote in message
    > news:...
    >>
    >>
    >> "S N" wrote:
    >>
    >>> Just one clarification
    >>> You intended
    >>> For i = 1 To oStream.Size / clChunkSize
    >>> or
    >>> For i = 1 To oStream.Size \ clChunkSize

    >>
    >> He *intended* the latter.
    >>
    >> The backslash operator means "integer division" in VBScript (and VB and
    >> VB.NET) code.
    >>
    >> That is,
    >> a \ b
    >> is equivalent to
    >> INT( a / b )
    >>
    >> ********************
    >>
    >> Also, you don't need to mess with Response.Buffer=False, at all.
    >>
    >> Just follow each
    >> Response.BinaryWrite
    >> with
    >> Response.Flush
    >>
    >> Now the buffer will never get more full than one "chunkSize".
    >>

    >
    > Yes that would work. However it would mask unintended errors that turning
    > the buffer off right at the top of the code exposes.
    >
    > --
    > Anthony Jones - MVP ASP/ASP.NET
    >
    >




    what kind of errors would be exposed by turning off the buffer. kindly
    elaborate.
    S N, Sep 13, 2008
    #18
  19. "S N" <> wrote in message
    news:...
    >
    > "Anthony Jones" <> wrote in message
    > news:...
    >> "Old Pedant" <> wrote in message
    >> news:...
    >>>
    >>>
    >>> "S N" wrote:
    >>>
    >>>> Just one clarification
    >>>> You intended
    >>>> For i = 1 To oStream.Size / clChunkSize
    >>>> or
    >>>> For i = 1 To oStream.Size \ clChunkSize
    >>>
    >>> He *intended* the latter.
    >>>
    >>> The backslash operator means "integer division" in VBScript (and VB and
    >>> VB.NET) code.
    >>>
    >>> That is,
    >>> a \ b
    >>> is equivalent to
    >>> INT( a / b )
    >>>
    >>> ********************
    >>>
    >>> Also, you don't need to mess with Response.Buffer=False, at all.
    >>>
    >>> Just follow each
    >>> Response.BinaryWrite
    >>> with
    >>> Response.Flush
    >>>
    >>> Now the buffer will never get more full than one "chunkSize".
    >>>

    >>
    >> Yes that would work. However it would mask unintended errors that
    >> turning the buffer off right at the top of the code exposes.
    >>
    >>

    >
    >
    >
    > what kind of errors would be exposed by turning off the buffer. kindly
    > elaborate.
    >


    Well the sort of problems you've discovered where you may unintentionaly be
    placing things in the output buffer that you didn't want present. Example:-

    <!-- #include /virtual="/someinclude.asp" -->
    <%
    Response.ContentType = "application/octet-stream"
    Do Until ....
    Response.BinaryWrite SomeStuff
    Response.Flush
    Loop
    %>

    'someinclude.asp

    <!-- Ooops some accidental static content here -->
    <%

    'utility code

    %>

    Placing a Response.Buffer at the top of your page would barf immediately on
    that line alerting you to a problem.
    It also saves you having to remember to Response.Flush if you have multiple
    places where you write to the buffer.

    --
    Anthony Jones - MVP ASP/ASP.NET
    Anthony Jones, Sep 13, 2008
    #19
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Charlie@CBFC
    Replies:
    1
    Views:
    2,840
    Arlyn
    May 13, 2005
  2. Replies:
    1
    Views:
    831
  3. MichiMichi
    Replies:
    1
    Views:
    774
    MichiMichi
    Mar 1, 2007
  4. Replies:
    1
    Views:
    1,079
    Victor Bazarov
    Jun 28, 2005
  5. S N
    Replies:
    0
    Views:
    238
Loading...

Share This Page