Toon posts:

[ASP] File download via Binarywrite maar 35MB Max?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een download script (zie onder) die een browser een file aanbied. dit gebeurt met Binarywrite.
Helaas kom ik met deze methode niet boven een file van 35 MB of hoger (er onder is geen probleem). De browser geeft geen error maar hij blijft proberen de file te halen (onder de 35 mb duurt dit 5 sec).

Wie heeft hier een oplossing voor of kent dit probleem.

Code:

<%
On Error Resume Next
If Not Response.isClientConnected Then
Response.end
End If
Response.buffer = true
Response.clear

Dim mFile
Dim mStream
Dim fso,stream


mFile = Trim(Request.QueryString("file"))

Response.contenttype = "application/octet-stream"

'Custom server component
Set objBinFile = Server.CreateObject("ASPBinFile.clsASPBinFile")

mStream = objBinFile.BinFileRead(mFile)

'Use FilesystemObject to get file size (does not work with above special dll
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set stream = fso.GetFile(mFile)

Response.AddHeader "content-length", stream.Size
Response.Addheader "Content-Disposition", "Inline; filename=file.exe"
'Response.Addheader "Content-Disposition", "Inline; filename=" & mFile


Response.CacheControl = "public"
Response.binarywrite mstream
Set objBinFile = Nothing
Set fso = Nothing

Response.End
%>

Dit is de DLL voor het aanbieden van de file (ASPBinFile.clsASPBinFile):

{ASPBinFile.dll}

VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "clsASPBinFile"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit


Function BinFileRead(ByVal inFileSpec As String) As Variant
On Error GoTo errHandler
Dim mHandle
Dim lngFileLen As Long
Dim arrData() As Byte

mHandle = FreeFile
Open inFileSpec For Binary Access Read As #mHandle

lngFileLen = FileLen(inFileSpec)
ReDim arrData(lngFileLen)

Get #mHandle, , arrData
Close #mHandle

BinFileRead = arrData
Exit Function

errHandler:
End Function

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 09:31

Crazy D

I think we should take a look.

Kan ook nog zijn dat het probleem zich in combinatie met die dll voordoet. Al zou ik mij trouwens afvragen of ik een file van 35Mb op deze manier ter download zou aanbieden, das lekker voor de performance van je webserver :)
Probeer het eens met het ADODB.Stream object, misschien dat dat nog een verschil uitmaakt. Mjah als er niks over een max staat in MSDN bij response.binarywrite mag je er vanuit gaan dat 35Mb op zich geen probleem hoeft te zijn.

Exact expert nodig?


Verwijderd

Topicstarter
Met ADODB.Stream heb ik het ook al gebrobeert.. Zelfde resultaat

Dan zou je denken dat het niet aan de dll zou liggen maar aan Binarywite of aan de server.

Verwijderd

Ik denk dat je ASP server het niet leuk vind om die 35 MB te bufferen (immers, je zegt dat de response moet worden gebufferd, tenminste dat maak ik op met mijn minimale ASP kennis). Is het niet een beter idee om een redirect naar de download te geven, ipv deze via een script te laten outputten?

Het komt ongetwijfeld vast niet voor met je scriptje, maar stel dat er 100 clients dit downloaden. Worst case scenario is dit 3,5 GB geheugen. Als je dat gebuffer weglaat doet ie het vast ook wel en dan hoeft ie niet de hele file in te lezen, te bufferen en daarna weg te sturen. Scheelt ook in snelheid (niet die 5 seconden wachten enzo).

[ Voor 0% gewijzigd door Verwijderd op 04-08-2002 15:54 . Reden: uitbreiding ]


Verwijderd

Waarom doe je niet Response.Redirect(Sbestandsnaam) of Server.Execute(Sbestandsnaam)
of Response.Transfer(Sbestandsnaam)

is volgens mij makkelijker. Bij laatste twee merkt de gebruiker niet. De eerste kun je het adres van de download achterhalen.

Verwijderd

Topicstarter
kan je daarmee ok een locatie zoals c:\files\file.exe aangeven??

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Nee :)
Misschien kan je een file tijdelijk kopieren naar een mapje dat wel via het web beschikbaar is en van daaruit serveren?

Verwijderd

Topicstarter
Is het wel zo te maken op die manier als je file in de webroot staat dat ie alleen door het ASP script te downloaden is??

Of zijn er nog andere manieren dan BinaryWrite om een file naar de browser te sturen

Verwijderd

Misschien kan je instellen dat die "publieke" dir alleen toegangelijk is voor de localhost ofzo.

Verwijderd

Topicstarter
Wie heeft er een klein voorbeeldje om met Server.Execute of Transfer een file naar de browser te sturen

  • nxt
  • Registratie: November 2001
  • Laatst online: 26-08 13:51

nxt

dit lijken me beide geen goede methodes,
The Execute method executes an ASP file from inside another ASP file. After executing the called .asp file, the control is returned to the the original .asp file.
bron
Note: The Transfer method is an efficient alternate for the Response.Redirect. A redirect forces the Web server to handle an extra request while the Server.Transfer method transfers execution to a different ASP page on the server, and avoids the extra round trip.
bron

met Response.Redirect zou het wel moeten kunnen, maar zoals al gezegt alleen indien de file ook gedownload kan worden door de url in de browser in te typen.
maar had je al geprobeert om de buffer uit te zetten?
( Response.buffer = false )

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Is het geen script timeout die na een aantal seconden je script eruit gooit?

Verwijderd

Topicstarter
Ik heb de buffer uitgezet en nu gaat het downloaden goed tot 47MB daarna download hij vrijwel lege bestanden en is hij na 0,1 sec klaar.

Server.Transfer en Server.execute zijn idd geen goede methodes..


Volgens mij heeft het niks met een timeout te maken.. Maar ik kan het nog checken.. waar zou dat moeten zitten in IIS5 of moet dat dan in mijn asp script staan?

  • nxt
  • Registratie: November 2001
  • Laatst online: 26-08 13:51

nxt

Verwijderd schreef op 04 augustus 2002 @ 23:59:
...Volgens mij heeft het niks met een timeout te maken.. ... waar zou dat moeten zitten in IIS5 of moet dat dan in mijn asp script staan?
timeout kun je instellen bij de properties van de website
tabblad 'Home Directory', en dan de Configuration knop, en dan zit het onder
'App Options'
Pagina: 1