22 messaggi dal 23 gennaio 2007
Buongiorno, vorrei chiedere un favore immenso alle persone che conoscono ado.net a fondo per asp.net. Ho la necessita, per una questione di sicurezza di contenuti, di nascondere i link di download anche alle persone registrate all'intern del sito web. Per far cio' ho usato una pagina asp 3.0 che implementa ADO con questo codice all'interno:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">;

<html xmlns="http://www.w3.org/1999/xhtml"; >
<head><title>Download</title></head>
<body>


<!--METADATA TYPE="typelib"
UUID="00000205-0000-0010-8000-00AA006D2EA4"
NAME="ADODB Type Library"
-->
<%
' METADATA SERVE PER IMPORTARE LE COSTANTI DI ADO2.5

Response.Buffer = true


Set objStream = Server.CreateObject("ADODB.Stream")

objStream.Type = adTypeBinary
objStream.Open
scarica = Request.QueryString("NomeInCodice")
If scarica = "1" Then scarica1 = "FRNNF.PDF"
If scarica = "2" Then scarica1 = "FZZZZ.PDF"
objStream.LoadFromFile Server.MapPath("/public/domodossola/" & scarica1)

' stream generico, IE chiede di salvare
Response.ContentType = "application/octet-stream"

Response.AddHeader "Content-Disposition", "attachment; filename=" & scarica & ".pdf"
Response.AddHeader "Content-Length", strFileSize
Response.Charset = "UTF-8"
Response.ContentType = ContentType
Do While Not objStream.EOS
Response.BinaryWrite objStream.Read(1024)
Response.Flush
Loop
objStream.Close
Set objStream = Nothing


%>


</body>
</html>


Il codice funziona a meraviglia visto che spezzetta nel buffer file anche di 150MB !!! Molti script su internet non funzionano per file immensi... questo e' una meraviglia.

HA SOLO UN DIFETTO !!!!

Siccome il sito e' fatto in asp.net linguaggio VB, non posso trasferire la var di sessione alla pagina web asp 3.0 riportata sopra. quindi scoperto il link della pagina asp 3.0 con un download manager si possono scaricare i contenuti senza neanche essere registrati al sito.

Le soluzioni a cui avevo pensato sono due:

1) trasformare la pagina asp 3.0 in asp.net (CHE NON SO FARE... qualcuno potrebbe tradurla??)

2) Scrivere un file su disco di sessione e cancellarlo dopo il download?? ma si puo fare? quando si capisce che il download e' davvero finito e non messo in pausa o roba simile??

3)perche' non posso passare una variabile di sessione ''comune'' dalle pagine aspx alle pagine asp?? Mannaggia... come risolvo il problema?? Devo proprio trascrivere il codice in .net mi sa!!!!

Vi prego aiutatemi!! E' davvero importante.... su internet non sono riuscito a trovare nulla sul download forzato in asp.net
Modificato da criptus il 25 gennaio 2007 22.02 -
3.168 messaggi dal 06 settembre 2002
Contributi | Blog
Ciao,

se il problema è il passagio di una varaibile di sessione tra asp e asp.net, allora puoi utilizzare un file per passarla.

HTH
.

Nothing can be born from hartred

Stefano (SM15455) Mostarda
http://blogs.aspitalia.com/SM15455
Rome Italy
426 messaggi dal 17 aprile 2006
http://objectsharp.com/cs/blogs/bruce/articles/1571.aspx

Ciao Alessandro
22 messaggi dal 23 gennaio 2007
ok.. ottima idea... ci avevo pensato durante la notte ma ho solo un dubbio:

la pagina ASP.NET scrive il file;
La pagina asp.net richiama con redirect la pagina asp
la pagina asp legge il file e lo cancella.


Queste sarebbero le procedure da fare.

SIAMO SICURI AL 100% che le seguenti operazioni, una volta scritte, siano sincronizzate?

ovvero asp.net esegue l'struzione seguente alla scrittura del file solo dopo che ha creato con successo il file o sono operazioni ASINCRONE ??
3.168 messaggi dal 06 settembre 2002
Contributi | Blog
Ciao,

le operazioni sono sincrone a meno che non sia tu da codice a renderle asincrone.

HTH
.

Nothing can be born from hartred

Stefano (SM15455) Mostarda
http://blogs.aspitalia.com/SM15455
Rome Italy
426 messaggi dal 17 aprile 2006
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)

Ciao Alessandro

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.