scusa se non ti ho supportato prima... avevo da fare ed ho provato a mandarti un link che spiegava le differenti metodologie per offrire il download agli utenti.
se il tuo scopo è semplicemente quello di servire file e possibilmente nella metodologia fatta in asp e se non ho capito male hai tutto il sito in Vb.Net allora ti posto il codice tradotto.
premetto che lavoro quasi esclusivamente in c# ed ho avuto qualche difficoltà di traduzione in vb soprattutto per gli array di byte. io l'ho provato e funziona con file di grandi dimensioni.
modifica il buffer come vuoi (cioè della lunghezza che vuoi)
modificando Dim buffer(10000) As Byte e
length = iStream.Read(buffer, 0, 10000)
Private Sub DownLoadFile(ByVal sFilePathName As String, ByVal sFileReName As String)
Dim sDwFileName As String
If (sFileReName = "") Then
sDwFileName = sFilePathName.Substring(sFilePathName.Length - 3, 3)
Else
sDwFileName = sFileReName
End If
Response.Clear()
' cambiare il ContentType per servire il file
Response.ContentType = "application/octet-stream; filename=" & sDwFileName
' forza l'apertura del messagebox apri salva annulla anzichè servire il file direttamente nel browser
Response.AddHeader("content-disposition", "attachment; filename=" & sDwFileName)
'scarica il contenuto della response
Response.Flush()
Dim bNoTrap As Boolean
bNoTrap = False
Dim iStream As System.IO.Stream '.IO.Stream
' Buffer di lettura di 10K bytes alla volta:
Dim buffer(10000) As Byte
' Lunghezza del file:
Dim length As Integer
' Byte totali da leggere:
Dim dataToRead As Long
Try
' Apre il file dal file system.
iStream = New System.IO.FileStream(Server.MapPath(sFilePathName), System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)
' Valorizzo la variabile dei Byte Totali da leggere:
dataToRead = iStream.Length
' Ciclo di lettura file.
While (dataToRead > 0)
' Verifica che il client sia connesso.
If (Response.IsClientConnected) Then
' Lettura dati nel Buffer.
length = iStream.Read(buffer, 0, 10000)
' Scrittura dati nell' ouptut stream.
Response.OutputStream.Write(buffer, 0, length)
' Scarico dati per il rendering sull'output HTML.
Response.Flush()
' decrementa il valore dei dati ancora da leggere
dataToRead = dataToRead - length
Else
'Previene loop infinito nel caso in cui il client sia disconnesso
dataToRead = -1
End If
End While
bNoTrap = True
Response.Flush()
Response.End()
Catch ex As Exception
' Cattura errore eventuale
If bNoTrap = False Then
Response.Write("Error : " + ex.Message)
End If
Finally
If Not iStream Is Nothing Then
'Chiusura del file di lettura.
iStream.Close()
End If
End Try
End Sub
la sub prevede due stringhe perchè la prima rappresenta il file con il percorso a partire dalla root, la seconda invece il nome del file che si vuole che l'utente veda e/o salva.
se vuoi rendere meno riconoscibili i file nel tuo sito li puoi salvare con nomi non significativi e addirittura senza estensione memorizzando il percorso ed il nome completo nel db. poi quando l'utente scarica il file gli rimetti il nome originale comprensivo di suffisso (valorizzando la variabile rename)
infine una cosa... non è bello tenere una pagina asp con tanto di sessione web solo per scaricare file quando tutto il sito è in asp.net.
vabbene gli excamotage ma talvolta si esagera :)
ciao
Alessandro Di Cicco
ps. leggiti il link che ti ho mandato
pps. chi vuole lo stesso codice in un linguaggio più cristiano (c#) chidetemelo e ve lo posto volentieri (anche perchè l'ho fatto in c# e poi tradotto (spero bene) in vb)