CodingForums.com

CodingForums.com (http://www.codingforums.com/index.php)
-   ASP (http://www.codingforums.com/forumdisplay.php?f=8)
-   -   forcing asp download problems with large files (http://www.codingforums.com/showthread.php?t=275514)

germus 10-06-2012 08:20 PM

forcing asp download problems with large files
 
I use this code to force the download files:

<%
file = Request.QueryString("file")
path=Request.QueryString("dir")+file
ContentType = "application/x-msdownload"
Response.Buffer = True
Const adTypeBinary = 1
Response.Clear
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile Server.MapPath(path)
ContentType = "application/octet-stream"
Response.AddHeader "Content-Disposition", "attachment; filename=" & file
Response.Charset = "UTF-8"
Response.ContentType = ContentType
Response.BinaryWrite objStream.Read
Response.Flush
objStream.Close
Set objStream = Nothing
%>

it works very well !

But I have a problem with files size large ...
there is anyone to help me?

Old Pedant 10-08-2012 07:04 AM

It depends on where your problem is.

If the file is too large to load into the stream with LoadFromFile then there is no easy answer.

If the problem is simply that your Response buffer is too small, then it's fixable.

objStream.Read can take one argument: The number of bytes to read. So you can do this in chunks.

EXAMPLE ONLY:

In place of
Code:

Response.BinaryWrite objStream.Read
you could try doing:
Code:

CONST CHUNK = 100000 ' experiment to get best chunk size
byteCount = objStream.Size
Do While byteCount > CHUNK
    Response.BinaryWrite objStream.Read(CHUNK)
    Response.Flush
    byteCount = byteCount - CHUNK
Loop
Response.BinaryWrite objStream.Read(byteCount)

This is untested code. I remember doing something like this almost 10 years ago, so I'm really dredging this out of vary old human memory. (Both the human and the memory are old.)

germus 10-08-2012 08:55 AM

solved !

In place of

Response.BinaryWrite objStream.Read

I tried

Do While Not objStream.EOS
Response.BinaryWrite objStream.Read(4096)
Response.Flush
Loop

it works perfectly

Old Pedant 10-08-2012 10:46 PM

Yes, same idea as what I gave. Simpler coding, but would be same result: Just do it in "chunks". But 4096 is a very tiny chunk size. Not very efficient. You really should try increasing the chunk size *A LOT* to find the optimum size.


All times are GMT +1. The time now is 03:33 AM.

Powered by vBulletin®
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.