Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27

Discussione: Problema con file ashx

  1. #1
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,567

    Problema con file ashx

    Ho questo file ashx che uso per il download di files&co: ci arrivo con un href, gli passo due parametri in querystring e lui si prende il file da restituire e me lo passa (un modo come un altro per non mostrare all'utente in chiaro il percorso del file che sta scaricando).
    Funziona, nel senso che sto provando a scaricare un file txt, lui lo trova e me lo passa chiedendomi se lo voglio aprire o scaricare, me lo apre (o me lo scarica) ma qui poi succede qualcosa per cui mi esce un'eccezione e nel testo del file trovo accodato "thread interrotto" (che è il message dell'eccezione)....
    cosa sbaglio?

    codice:
    <%@ WebHandler Language="VB" Class="dloader" %>
    
    Public Class dloader : Implements System.Web.IHttpHandler
    
        Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    
            Dim sContentType As String = ""
            Dim sezione As Integer = "" & context.Request("w")
            Dim nomefile As String = "" & context.Request("fn")
            Dim fullpath = ConfigurationManager.AppSettings("repopath") & "\repo" & sezione & "\" & nomefile
            fullpath = Replace(fullpath, "\\", "\")
    
            Try
               sContentType = System.Web.MimeMapping.GetMimeMapping(nomefile)
    
                Dim bData As Byte()
                Dim br As System.IO.BinaryReader = New System.IO.BinaryReader(System.IO.File.OpenRead(fullpath))
                bData = br.ReadBytes(br.BaseStream.Length)
                SaveDocOutputStreamAttachment(bData, nomefile, sContentType)
    
    
            Catch ex As Exception
                context.Response.ContentType = "text/plain"
                context.Response.Write(vbCrLf & "Impossibile restituire il contenuto del file, potrebbe essere corrotto. " & vbCrLf)
                context.Response.Write(ex.Message)
    
            End Try
    
    
    
        End Sub
    
        '---------------------------------------------------------------------------------------------------------------------------------------------------
        'salva buffer di byte nello stream di uscita come attachemt
        '---------------------------------------------------------------------------------------------------------------------------------------------------
        Public Sub SaveDocOutputStreamAttachment(buffer As Byte(), nomeDocumento As String, Optional contentType As String = "application/octet-stream")
            System.Web.HttpContext.Current.Response.Clear()
            System.Web.HttpContext.Current.Response.HeaderEncoding = Encoding.Default
            System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", String.Format("attachment; filename=""{0}""", nomeDocumento))
            System.Web.HttpContext.Current.Response.AddHeader("Content-Length", buffer.Length.ToString)
            System.Web.HttpContext.Current.Response.ContentType = contentType
            If buffer.Length > 0 Then
                'queste due istruzioni sono equivalenti
                System.Web.HttpContext.Current.Response.OutputStream.Write(buffer, 0, buffer.Length)
                'System.Web.HttpContext.Current.Response.BinaryWrite(buffer)
            End If
    
            System.Web.HttpContext.Current.Response.Flush() : System.Web.HttpContext.Current.Response.End()
    
        End Sub
    
        ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
            Get
                Return False
            End Get
        End Property
    
    
    End Class
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  2. #2
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,567
    PS: si tratta del codice che mi aveva passato pietro09 in altro thread
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    9,991
    ho messo:
    Dim sezione As String = "" & context.Request("w")
    e
    bData = br.ReadBytes(CInt(br.BaseStream.Length))

    e lo prova con:
    http://localhost/WebApplication1/dlo...x?fn=prova.txt

    se non faccio così non lo compila
    Pietro

  4. #4
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,567
    Si il primo è una svista, la variabile è string.
    Il secondo l'ho modificato ma la faccenda non cambia... mi restituisce il mio txt con dentro il contenuto corretto ma in più aggiunge "Impossibile restituire il contenuto del file, potrebbe essere corrotto.
    Thread interrotto."

    Non mi spiego l'eccezione... lho messo in debug: arriva alla prima metà (fino ai due punti) della riga
    codice:
    System.Web.HttpContext.Current.Response.Flush() : System.Web.HttpContext.Current.Response.End()
    e qui mi apre la mascherina di selezione di cosa voglio fare (scaricare o aprire) del mio file.
    Seleziono apri, il debugger passa alla seconda metà della riga (dopo i due punti) e poi torna al catch exception della processrequest...
    Devo mica togliere il current.response.end?
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  5. #5
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,567
    Bingo... togliendo il System.Web.HttpContext.Current.Response.End() funziona perfectly.
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    9,991
    la cosa mi interessa. Se hai tempo e se ti va, puoi mandare un esempio completo ma semplice in modo da replicare l'errore? (possibilmente col framework 4, perchè io uso ancora vs2010).
    Se non fosse possibile, non fa nulla.
    Pietro

  7. #7
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,567
    E' tutto lì: puoi copiarlo e incollarlo in notepad e salvarlo come .ashx
    La var
    codice:
    Dim fullpath = ConfigurationManager.AppSettings("repopath") & "\repo" & sezione & "\" & nomefile
            fullpath = Replace(fullpath, "\\", "\")
    contiene il percorso del file da presentare all'utente. Ho messo una prima parte del percorso in web.config e completo il percorso e il nome file con due parametri che passo in querystring al link, ad es. così:
    http://localhost/.../dloader.ashx?w=4&fn=myfile.txt

    Non c'è altro.

    Testato solo su Firefox a dire il vero.... ora faccio un giro anche su altri browser per sicurezza... hai visto mai...
    Ultima modifica di supermac; 04-04-2019 a 09:06
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    9,991
    Ti ringrazio.
    Pietro

  9. #9
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,567
    Perfetto su Chrome (a parte che non chiede cosa vuoi fare se scaricare o aprire ma scarica direttamente)
    E anche su I.E. funzia.

    Fammi sapere se trovi qualcosa.
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  10. #10
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    9,991
    se ti funziona, ti funziona! c'è poco da discutere.
    E' che quella procedura l'ho messa in una libreria e la uso nelle pagine aspx.
    Ad esempio un pulsante che fa il dowload di un file excel, pdf, csv o altro.
    E lì, mettere response.end mi pare obbligato.

    comunque, ho provato il tuo codice in una pagina ashx e mi funziona.
    (se ricordo bene, però, non funziona assolutamente il debug)
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.