473,396 Members | 2,011 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

Adodb.Stream - Problem download big files

Hi!
I want to use ASP to download big files using ADODB.STREAM. It works very
fine with files smaller than 80 MB.
On the Webserver I can see that memory allocation and the process w3wp is
running. After some time (more or less 2 minutes) I get a response timeout.

Here is the code:

Server.ScriptTimeout = 30000
Response.Buffer = True

Response.Clear
Response.Expires = 0
Response.ContentType = "Download-File"
Response.AddHeader "Content-Disposition","attachment; filename=" & sfile

Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = adTypeBinary
oStream.Open
oStream.LoadFromFile(sfile)
Response.AddHeader "Content-Length", oStream.Size ' -- Schönheit
Response.CharSet = "UTF-8"

For i = 0 To oStream.Size
i = i + 128000
Response.BinaryWrite(oStream.Read(128000))
Response.Flush

Next

oStream.Close
Set oStream = Nothing
Response.Flush
Response.End

Do I have to change something in my code - or perhaps a general setting in
IIS / the metabase?

Many thanks in advance

Juan
Jul 3 '08 #1
10 19270
"Juan" <Ju**@discussions.microsoft.comwrote in message
news:71**********************************@microsof t.com...
Hi!
I want to use ASP to download big files using ADODB.STREAM. It works very
fine with files smaller than 80 MB.
On the Webserver I can see that memory allocation and the process w3wp is
running. After some time (more or less 2 minutes) I get a response
timeout.
>
Here is the code:

Server.ScriptTimeout = 30000
30,000 seconds is a long script time out ;)
Response.Buffer = True
Change to False, you don't want to buffer anyway (yes I know you are
flushing but this is simpler).
>
Response.Clear
Response.Expires = 0
Response.ContentType = "Download-File"
This is not a valid content type if you don't know what the content type is
use the fallback type: "application/octet-stream"
Response.AddHeader "Content-Disposition","attachment; filename=" & sfile

Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = adTypeBinary
oStream.Open
oStream.LoadFromFile(sfile)
Response.AddHeader "Content-Length", oStream.Size ' -- Schönheit
Don't add the Content-Length header its a duplication, ASP adds that for
you.
Response.CharSet = "UTF-8"
How come you know the character encoding but don't know the content type?
Consider deleting this line or setting the content-type to the correct text
type.

>
For i = 0 To oStream.Size
i = i + 128000
Response.BinaryWrite(oStream.Read(128000))
Response.Flush
No need for a flush when buffering is off.
>
Next

oStream.Close
Set oStream = Nothing
Response.Flush
Response.End
Again no need for a flush and .End is draconian, only use it if you know
something bad will happen if you don't. Even then design out the something
bad rather than use .End.
>
Do I have to change something in my code - or perhaps a general setting in
IIS / the metabase?
The response timeout is a clientside thing however normally response
timeouts related to the time it takes to get the first chunk of data not the
overall send time.

--
Anthony Jones - MVP ASP/ASP.NET
Jul 3 '08 #2
Anthony wrote on Thu, 3 Jul 2008 14:33:27 +0100:
"Juan" <Ju**@discussions.microsoft.comwrote in message
news:71**********************************@microsof t.com...
>Hi!
>I want to use ASP to download big files using ADODB.STREAM. It works
very fine with files smaller than 80 MB.
On the Webserver I can see that memory allocation and the process
w3wp is running. After some time (more or less 2 minutes) I get a
response
timeout.
>Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = adTypeBinary oStream.Open oStream.LoadFromFile(sfile)
Response.AddHeader "Content-Length", oStream.Size ' -- Schönheit
Don't add the Content-Length header its a duplication, ASP adds that
for you.
If the stream is being written out in chunks (which it is in the For Next
loop), how does the ASP engine know what the final size will be?

--
Dan
Jul 3 '08 #3
Juan wrote on Thu, 3 Jul 2008 06:00:01 -0700:
Hi!
I want to use ASP to download big files using ADODB.STREAM. It works
very fine with files smaller than 80 MB.
On the Webserver I can see that memory allocation and the process w3wp
is running. After some time (more or less 2 minutes) I get a response
timeout.
Here is the code:
Server.ScriptTimeout = 30000
Response.Buffer = True
Response.Clear
Response.Expires = 0
Response.ContentType = "Download-File"
Response.AddHeader "Content-Disposition","attachment; filename=" &
sfile
Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = adTypeBinary oStream.Open oStream.LoadFromFile(sfile)
Response.AddHeader "Content-Length", oStream.Size ' -- Schönheit
Response.CharSet = "UTF-8"
For i = 0 To oStream.Size
i = i + 128000
Response.BinaryWrite(oStream.Read(128000))
Response.Flush
Next
This looks odd - you're looping from 0 to the size of the stream, yet you're
pushing out 128000 bytes at a time. I think you should be using

For i = 0 To oStream.Size Step 128000
Also, in your loop what happens when you reach the end of the stream?
This is how I handle download from one of my applications

Set oStream = Server.CreateObject("ADODB.Stream")
Call oStream.Open()
oStream.Type = 1
call oStream.LoadFromFile(strFilename)

iDownload = 1
If lcase(right(strfilename,4)) = ".pdf" then
Response.ContentType = "application/pdf"
else
Response.ContentType = "application/octet-stream"
end if
Response.AddHeader "Content-Disposition", "filename=" &
strfilename & ";"

Response.Buffer = False

'stream out the file in chunks
Do While Not (oStream.EOS)
Response.BinaryWrite oStream.Read(1024 * 256)
Loop

oStream.Close
Set oStream = Nothing
this reads the file into the stream (just like you already have), sets an
appropriate ContentType (as Anthony points out the one you use is not a
recognised MIME type), turns off buffering, and then writes out the stream
in 256kB chunks until there is nothing left to write to out (using
oStream.EOS to determine if the stream is at the end).

You really do need buffering turned off - it's entirely possible that the
80MB file is going over the defined ASP buffer limit and so you're getting
an ASP error thrown into the data, and that causes what appears to be a
timeout but is actually due to ASP terminating the script because it has
errored. So far with the above code I've had no trouble with files larger
than the defined ASP buffer limit, but I haven't tried it with anything as
large as your file.

--
Dan
Jul 3 '08 #4
Daniel wrote to Anthony Jones on Thu, 3 Jul 2008 17:14:31 +0100:
Anthony wrote on Thu, 3 Jul 2008 14:33:27 +0100:
>"Juan" <Ju**@discussions.microsoft.comwrote in message
news:71**********************************@microso ft.com...
>>Hi!
>>I want to use ASP to download big files using ADODB.STREAM. It works
very fine with files smaller than 80 MB.
On the Webserver I can see that memory allocation and the process
w3wp is running. After some time (more or less 2 minutes) I get a
response
timeout.
>>Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = adTypeBinary oStream.Open oStream.LoadFromFile(sfile)
Response.AddHeader "Content-Length", oStream.Size ' -- Schönheit
>Don't add the Content-Length header its a duplication, ASP adds that
for you.
If the stream is being written out in chunks (which it is in the For
Next loop), how does the ASP engine know what the final size will be?
Actually, I've just realised that the code I use myself doesn't set the
Content-Length header either. ASP doesn't add the Content-Length header
itself either as it has no idea what the file size is when it starts
outputting it, here's an example of the ASP headers from a download from my application:

HTTP/1.1 200 OK
Cache-Control: private
Date: Thu, 03 Jul 2008 16:26:53 GMT
Transfer-Encoding: chunked
Content-Type: application/pdf
Server: Microsoft-IIS/6.0
Content-Disposition: filename=Certifications_at_a_Glance.pdf;
This just means that you don't get the status bar in IE, for instance,
showing the download progress because the final size is not known. Adding
the Content-Length header allows IE (and any other browser that will show a
status bar) to give a progress with a final size value. I tested adding the
content length header to my own application and the headers changed to:

HTTP/1.1 200 OK
Cache-Control: private
Date: Thu, 03 Jul 2008 16:29:46 GMT
Transfer-Encoding: chunked
Content-Length: 1890660
Content-Type: application/pdf
Server: Microsoft-IIS/6.0
Content-Disposition: filename=Certifications_at_a_Glance.pdf;

and appeared to have no detrimental effect on the download.

--
Dan
Jul 3 '08 #5
Daniel wrote to Juan on Thu, 3 Jul 2008 17:22:58 +0100:
Juan wrote on Thu, 3 Jul 2008 06:00:01 -0700:
>Hi!
>I want to use ASP to download big files using ADODB.STREAM. It works
very fine with files smaller than 80 MB.
On the Webserver I can see that memory allocation and the process
w3wp is running. After some time (more or less 2 minutes) I get a
response timeout.
>Here is the code:
>Server.ScriptTimeout = 30000
Response.Buffer = True
>Response.Clear
Response.Expires = 0
Response.ContentType = "Download-File"
Response.AddHeader "Content-Disposition","attachment; filename=" &
sfile
>Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = adTypeBinary oStream.Open
oStream.LoadFromFile(sfile)
Response.AddHeader "Content-Length", oStream.Size ' -- Schönheit
Response.CharSet = "UTF-8"
>For i = 0 To oStream.Size i = i + 128000
Response.BinaryWrite(oStream.Read(128000))
Response.Flush
Next
This looks odd - you're looping from 0 to the size of the stream, yet
you're pushing out 128000 bytes at a time. I think you should be using
I actually had another idea as to why it might be "timing out" - for 80MB of
data, your loop is running 83886080 times (80 * 1024 * 1024). If you are
using 128kB chunks, it only needs 666 loops to send 80MB. Check your event
logs and see if you have any ASP or IIS events pointing to the process being
terminated.

--
Dan
Jul 3 '08 #6
"Daniel Crichton" <ms****@worldofspack.comwrote in message
news:ey**************@TK2MSFTNGP06.phx.gbl...
Daniel wrote to Juan on Thu, 3 Jul 2008 17:22:58 +0100:
Juan wrote on Thu, 3 Jul 2008 06:00:01 -0700:
>Hi!

>I want to use ASP to download big files using ADODB.STREAM. It works
>very fine with files smaller than 80 MB.
>On the Webserver I can see that memory allocation and the process
>w3wp is running. After some time (more or less 2 minutes) I get a
>response timeout.
>Here is the code:
>Server.ScriptTimeout = 30000
>Response.Buffer = True
>Response.Clear
>Response.Expires = 0
>Response.ContentType = "Download-File"
>Response.AddHeader "Content-Disposition","attachment; filename=" &
>sfile
>Set oStream = Server.CreateObject("ADODB.Stream")
>oStream.Type = adTypeBinary oStream.Open
>oStream.LoadFromFile(sfile)
>Response.AddHeader "Content-Length", oStream.Size ' -- Schönheit
>Response.CharSet = "UTF-8"
>For i = 0 To oStream.Size i = i + 128000
> Response.BinaryWrite(oStream.Read(128000))
> Response.Flush
>Next
This looks odd - you're looping from 0 to the size of the stream, yet
you're pushing out 128000 bytes at a time. I think you should be using

I actually had another idea as to why it might be "timing out" - for 80MB
of
data, your loop is running 83886080 times (80 * 1024 * 1024). If you are
using 128kB chunks, it only needs 666 loops to send 80MB. Check your event
logs and see if you have any ASP or IIS events pointing to the process
being
terminated.
The loop is incrementing 128001 every iteration so potentially it may not
send all the file

--
Anthony Jones - MVP ASP/ASP.NET
Jul 3 '08 #7
"Daniel Crichton" <ms****@worldofspack.comwrote in message
news:eJ**************@TK2MSFTNGP06.phx.gbl...
Daniel wrote to Anthony Jones on Thu, 3 Jul 2008 17:14:31 +0100:
Anthony wrote on Thu, 3 Jul 2008 14:33:27 +0100:
>"Juan" <Ju**@discussions.microsoft.comwrote in message
>news:71**********************************@microso ft.com...
>>Hi!

>>I want to use ASP to download big files using ADODB.STREAM. It works
>>very fine with files smaller than 80 MB.
>>On the Webserver I can see that memory allocation and the process
>>w3wp is running. After some time (more or less 2 minutes) I get a
>>response
>timeout.

>>Set oStream = Server.CreateObject("ADODB.Stream")
>>oStream.Type = adTypeBinary oStream.Open oStream.LoadFromFile(sfile)
>>Response.AddHeader "Content-Length", oStream.Size ' -- Schönheit
>Don't add the Content-Length header its a duplication, ASP adds that
>for you.
If the stream is being written out in chunks (which it is in the For
Next loop), how does the ASP engine know what the final size will be?

Actually, I've just realised that the code I use myself doesn't set the
Content-Length header either. ASP doesn't add the Content-Length header
itself either as it has no idea what the file size is when it starts
outputting it, here's an example of the ASP headers from a download from
my application:
>
HTTP/1.1 200 OK
Cache-Control: private
Date: Thu, 03 Jul 2008 16:26:53 GMT
Transfer-Encoding: chunked
Content-Type: application/pdf
Server: Microsoft-IIS/6.0
Content-Disposition: filename=Certifications_at_a_Glance.pdf;
This just means that you don't get the status bar in IE, for instance,
showing the download progress because the final size is not known. Adding
the Content-Length header allows IE (and any other browser that will show
a
status bar) to give a progress with a final size value. I tested adding
the
content length header to my own application and the headers changed to:

HTTP/1.1 200 OK
Cache-Control: private
Date: Thu, 03 Jul 2008 16:29:46 GMT
Transfer-Encoding: chunked
Content-Length: 1890660
Content-Type: application/pdf
Server: Microsoft-IIS/6.0
Content-Disposition: filename=Certifications_at_a_Glance.pdf;

and appeared to have no detrimental effect on the download.
You're right it doesn't have any detrimental affect on IE in fact it serves
a useful purpose. However it is a strictly a breach of the protocol See
http://www.w3.org/Protocols/rfc2616/...c4.html#sec4.4 para 3.
However the protocol does then indicate that if it is Content-Length is
present it should be ignored in this case.
--
Anthony Jones - MVP ASP/ASP.NET
Jul 3 '08 #8
"Juan" <Ju**@discussions.microsoft.comwrote in message
news:71**********************************@microsof t.com...
Hi!
I want to use ASP to download big files using ADODB.STREAM. It works very
fine with files smaller than 80 MB.
On the Webserver I can see that memory allocation and the process w3wp is
running. After some time (more or less 2 minutes) I get a response
timeout.
>
Here is the code:

Server.ScriptTimeout = 30000
Response.Buffer = True

Response.Clear
Response.Expires = 0
Response.ContentType = "Download-File"
Response.AddHeader "Content-Disposition","attachment; filename=" & sfile

Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = adTypeBinary
oStream.Open
oStream.LoadFromFile(sfile)
Response.AddHeader "Content-Length", oStream.Size ' -- Schönheit
Response.CharSet = "UTF-8"

For i = 0 To oStream.Size
i = i + 128000
Response.BinaryWrite(oStream.Read(128000))
Response.Flush

Next

oStream.Close
Set oStream = Nothing
Response.Flush
Response.End

Do I have to change something in my code - or perhaps a general setting in
IIS / the metabase?

Many thanks in advance

FYI this is the routine I use for sending a file to response.

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

1MB buffer is a bit on the big side though 128K is a good choice.

--
Anthony Jones - MVP ASP/ASP.NET
Jul 3 '08 #9
Anthony Jones wrote on 03 jul 2008 in
microsoft.public.inetserver.asp.general:
FYI this is the routine I use for sending a file to response.

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
Would an error be given if an empty chunk or is sent?
And if the requested chunk size is larger than the remainder?

If not I would do:

For i = 0 To oStream.Size \ clChunkSize
Response.BinaryWrite oStream.Read(clChunkSize)
Next
oStream.Close

End Sub

1MB buffer is a bit on the big side though 128K is a good choice.


--
Evertjan.
The Netherlands.
(Please change the x'es to dots in my emailaddress)
Jul 4 '08 #10
Mister, any solution about it ??

any sample code that works fine ?? please

thanks in advance...

--
http://www.alhambra-eidos.es/web2005/index.html
www.kiquenet.net
http://www.setbb.com/putainformatica...opic.php?p=843
www.trabajobasura.com/solusoft

"Juan" wrote:
Hi!
I want to use ASP to download big files using ADODB.STREAM. It works very
fine with files smaller than 80 MB.
On the Webserver I can see that memory allocation and the process w3wp is
running. After some time (more or less 2 minutes) I get a response timeout.

Here is the code:

Server.ScriptTimeout = 30000
Response.Buffer = True

Response.Clear
Response.Expires = 0
Response.ContentType = "Download-File"
Response.AddHeader "Content-Disposition","attachment; filename=" & sfile

Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = adTypeBinary
oStream.Open
oStream.LoadFromFile(sfile)
Response.AddHeader "Content-Length", oStream.Size ' -- Schönheit
Response.CharSet = "UTF-8"

For i = 0 To oStream.Size
i = i + 128000
Response.BinaryWrite(oStream.Read(128000))
Response.Flush

Next

oStream.Close
Set oStream = Nothing
Response.Flush
Response.End

Do I have to change something in my code - or perhaps a general setting in
IIS / the metabase?

Many thanks in advance

Juan
Jul 8 '08 #11

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

7
by: Robert Brown | last post by:
Hi All, I am creating an interface into a Payment Gateway. I need to access a URL (which is a perl script) with paramters attached. I will then get a response within 10 seconds with information...
2
by: Richard K Bethell | last post by:
Hi, We have an application, written in ASP, that uses the ADODB.Stream to be able to open files and write byte arrays to the Response object. If one of our administrators patches the web servers...
0
by: microsoft | last post by:
Hi, I have an ASP script that initiates a ADODB.Stream like below first bit gets filename from the database strAbsFile = getfilefromDB(request.querystring("fileid")) '-- create FSO object...
1
by: A | last post by:
Hi all, I have an ASP page that downloads file with the ADODB.Stream object. I've found that if the user click cancel in the "Save file as" window or during the downloading, the download is no...
1
by: guyv | last post by:
Hello! I wanna read binary data from database with ADODB.Stream object. So I wrote code.. --------- <% query = "SELECT * FROM Categories" adoDB.DefaultDatabase = "Northwind"
3
by: C | last post by:
Re: Microsoft Knowledge Base Article - 870669 How to disable the ADODB.Stream object from Internet Explorer You may recently have heard of the vulnarability exposed by Internet Explorer as...
4
by: Fresh_Air_Rider | last post by:
Hi In the "good old" Classic ASP days, I used to stream records from a SQL Server database out to the user's browser in CSV format by using a combination of COALESCE and the ADODB.Stream object....
7
by: iporter | last post by:
I use the code below to authorise the download of certain files. Thus, instead of linking to the file in a wwwroot directory, I link to this code with the filename as a parameter, and the script...
3
gauravgmbhr
by: gauravgmbhr | last post by:
Hi All, I am trying to open a binary stream from a file and the creating a new stream from the opened stream and then trying to over wright the file and i am getting the following error ...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.