none
Download file senza appoggio di programmi come firefox o altro... RRS feed

  • Domanda

  • Vorrei che il mio programma possa scaricare da un indirizzo web un file, senza però fare uso di altri programma

    un esempio, come fa il browser firefox, che ha integrato una finestra che mostra i download in corso

     

    mercoledì 12 maggio 2010 17:34

Risposte

  • Non puoi scrivere il seguente pezzo di codice :

    client = New WebClient()
      AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
      AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler
    
      Try
       client.DownloadFileAsync(New Uri("http://www.miosito.it/directory/file.txt"), "c:\miofile.txt")
       message = "File Scaricato correttamente!"
      Catch ex As Exception
       message = String.Format("Errore nel download del file [{0}]", ex.Message)
      End Try
    

    così come lo hai messo, devi inserirlo all'interno di una function o sub.

    venerdì 14 maggio 2010 11:57
    Moderatore
  • guarda, io per scaricare un file da internet, lo faccio in un modo semplicissimo, e uso una finestra del programma con una barra di progresso che ti informa a che punto è il download ... ecco il codice:

     

    Public Class Form1
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        My.Computer.Network.DownloadFile("http://file_da_scaricare", "destinazione file scaricato ocmpreso di estensione", "", "", True, 500, True)
        'in questo modo, c'è il download del file, nella cartwlla specificata e anche una nuova finestra che contiene una progressbar 
    'che ti informa del progresso di download, e un bottone annulla per annullare l'operazione di download
      End Sub
    End Class

    lunedì 17 maggio 2010 14:14

Tutte le risposte

  • Se il tuo programma è un classico programma desktop puoi fare uso della classe WebClient (http://msdn.microsoft.com/it-it/library/system.net.webclient.aspx) la quale prevede un metodo DownloadFile (sincrono) e un metodo DownloadFileAsync (asincrono). In questo ultimo caso hai degli eventi che ti informano quando la progressione del download cambia (in modo che tu possa gestire una progressbar.
    mercoledì 12 maggio 2010 17:51
    Moderatore
  • cé sono diverse methodi:

    con i classi HTTPWebRequest e HTTPWebResponse

    con c# FTP library

    con FTPWebRequest e FTPWebResponse

    ...

    mercoledì 12 maggio 2010 19:55
  • ho letto ma non ci ho capito molto

    non sò dovè il codice e dove si mette

     

    è questo?

     

    Public
     Function
     DownloadData ( _
    address As String _
    ) As Byte ()
    giovedì 13 maggio 2010 12:51
  • Allora, supponi di avere un file da scaricare il cui indirizzo è http://www.miosito.it/directory/file.tx e di volerlo salvare in c:\, allora puoi scrivere:

    Dim message As String = ""
    Using client = New WebClient()
      Try
        client.DownloadFile(new Uri(http://www.miosito.it/directory/file.txt), "c:\miofile.txt")
        message = "File Scaricato correttamente!"
      Catch ex As Exception
        message = String.Format("Errore nel download del file [{0}]", ex.Message)
      End Try
    End Using
    

    Console.WriteLine(message)

    Questo codice va inserito nella funzione in cui effettui il download e scarica il file in maniera sincrona, cioè la tua applicazione è "freezata" finchè il download non è completato o si verifica un errore.

    Per fare in modo che la tua applicazione non sia bloccata, puoi lavorare in maniera asincrona:

    client = New WebClient()
        AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
        AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler
    
        Try
          client.DownloadFileAsync(New Uri("http://www.miosito.it/directory/file.txt"), "c:\miofile.txt")
          message = "File Scaricato correttamente!"
        Catch ex As Exception
          message = String.Format("Errore nel download del file [{0}]", ex.Message)
        End Try

    Questo comporta che la variabile client diventi un attributo privato della tua classe e che tu debba definire i gestori di evento per gli eventi DownloadFileCompleted e DownloadProgressChanged:

    Private Sub DownloadProgressChangedHandler(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
      ' qui metti l'aggiornamento della progressbar
    End Sub
    
    Private Sub DownloadFileCompletedHandler(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
      Dim message As String = ""
      If e.Error Is Nothing Then
        message = "File Scaricato correttamente!"
      Else
        message = String.Format("Errore nel download del file [{0}]", e.Error.Message)
      End If
      RemoveHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
      RemoveHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler
      Console.WriteLine(message)
    End Sub
    

    Ovviamente il pattern asincrono è più complicato

     

     

     

    giovedì 13 maggio 2010 13:19
    Moderatore
  • ok, prima di tutto grazie per l'aiuto

    però io non ho un indirizzo fisso da dove scaricare, vorrei che l'utente navigando sul web possa scaricare il file che desidera

    quindi vorrei che il form individui l'indirizzo automaticamente

    
    
    giovedì 13 maggio 2010 13:38
  • Questo è un altro discorso. Io ti ho messo un indirizzo fisso per esempio ma l'indirizzo (la stringa dentro l'URI) potrebbe anche essere una variabile così come il nome del file dove salvare.

    Immagino che la tua applicazione dovrà avere un controllo webbrowser in cui l'utente naviga, poi, ogni volta che la pagina viene caricata dovresti parserizzarti l'HTML alla ricerca dell'anchor (<a>) che punta ad un file (non ad una pagina ma ad un file) e, quindi mostrare l'elenco dei possibili file da scaricare. Quando l'utente ne seleziona uno e dedice di fare il download, allora interviene il pezzo di codice che ti ho riportato.

    Spero di essere stato chiaro.

    giovedì 13 maggio 2010 13:54
    Moderatore
  • scusa ma non ho capito molto

    per la mia soluzione devo mettere questo codice? nel form 1?

     

    client = New
     WebClient()
    AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
    AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler

    Try
    client.DownloadFileAsync(New Uri("http://www.miosito.it/directory/file.txt" ), "c:\miofile.txt" )
    message = "File Scaricato correttamente!"
    Catch ex As Exception
    message = String .Format("Errore nel download del file [{0}]" , ex.Message)
    End Try

    Questo comporta che la variabile client diventi un attributo privato della tua classe e che tu debba definire i gestori di evento per gli eventi DownloadFileCompleted e DownloadProgressChanged:

    Private
     Sub
     DownloadProgressChangedHandler(ByVal
     sender As
     Object
    , ByVal
     e As
     DownloadProgressChangedEventArgs)
    ' qui metti l'aggiornamento della progressbar
    End Sub

    Private Sub DownloadFileCompletedHandler(ByVal sender As Object , ByVal e As AsyncCompletedEventArgs)
    Dim message As String = ""
    If e.Error Is Nothing Then
    message = "File Scaricato correttamente!"
    Else
    message = String .Format("Errore nel download del file [{0}]" , e.Error .Message)
    End If
    RemoveHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
    RemoveHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler
    Console.WriteLine(message)
    End Sub

    giovedì 13 maggio 2010 17:20
  • La cosa più semplice è mettere il codice nella form oppure crearti delle classi apposite.
    giovedì 13 maggio 2010 18:10
    Moderatore
  • l'ho fatto ma mi dice che il codice è errato
    giovedì 13 maggio 2010 18:33
  • Per favore potresti postare il tipo di errore? Grazie.

    Tieni presente che il mio codice è un esempio, dovrai credo adattarlo al tuo caso.

    giovedì 13 maggio 2010 18:40
    Moderatore
  • allora credo che il problema sia adattarlo

    mi potresti dare (o fare) il codice esatto, te lo chiedo per favore
    mi manca solo questo al mio progetto e io non credo che ne sarei capace, pls
    giovedì 13 maggio 2010 18:45
  • il codice è esatto, nel senso che a me funziona. Dimmi che errore ti dà. Probabilmente ti mancano gli imports:

    Imports System.Web
    Imports System.Net
    Imports System.ComponentModel

     

    giovedì 13 maggio 2010 19:49
    Moderatore
  • per i 3 imports mi dice errore si sintassi

    poi altri errori sono: nome client non dichiarato come, webcliente

     

    downloadprogresschangerhadler non dichiarato

    giovedì 13 maggio 2010 19:53
  • Sei sicuro di non aver messo a capo di troppo?

     

    giovedì 13 maggio 2010 19:55
    Moderatore
  • stessa cosa

    ho messo così il tutto:

    tutto nel form 1

    Imports
     System.Web
    Imports System.Net
    Imports System.ComponentModel
    client = New
     WebClient()
    AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
    AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler

    Try
    client.DownloadFileAsync(New Uri("http://www.miosito.it/directory/file.txt" ), "c:\miofile.txt" )
    message = "File Scaricato correttamente!"
    Catch ex As Exception
    message = String .Format("Errore nel download del file [{0}]" , ex.Message)
    End Tr
    Private
     Sub
     DownloadProgressChangedHandler(ByVal
     sender As
     Object
    , ByVal
     e As
     DownloadProgressChangedEventArgs)
    ' qui metti l'aggiornamento della progressbar
    End Sub

    Private Sub DownloadFileCompletedHandler(ByVal sender As Object , ByVal e As AsyncCompletedEventArgs)
    Dim message As String = ""
    If e.Error Is Nothing Then
    message = "File Scaricato correttamente!"
    Else
    message = String .Format("Errore nel download del file [{0}]" , e.Error .Message)
    End If
    RemoveHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
    RemoveHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler
    Console.WriteLine(message)
    End Sub

    giovedì 13 maggio 2010 20:21
  • Perdonami ma vedo tanti "a capo" che non dovrebbero esserci.

    ad esempio tu hai

    Imports
    System.Web

    mentre dovrebbe essere

    Imports System.Web

    giovedì 13 maggio 2010 20:25
    Moderatore
  • Questo è quello cheho scritto

    Imports System.Web
    Imports System.Net
    Imports System.ComponentModel

    client = New WebClient()
        AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
        AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler

        Try
          client.DownloadFileAsync(New Uri("http://www.miosito.it/directory/file.txt"), "c:\miofile.txt")
          message = "File Scaricato correttamente!"
        Catch ex As Exception
          message = String.Format("Errore nel download del file [{0}]", ex.Message)
        End Try

    Private Sub DownloadProgressChangedHandler(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
      ' qui metti l'aggiornamento della progressbar
    End Sub

    Private Sub DownloadFileCompletedHandler(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
      Dim message As String = ""
      If e.Error Is Nothing Then
        message = "File Scaricato correttamente!"
      Else
        message = String.Format("Errore nel download del file [{0}]", e.Error.Message)
      End If
      RemoveHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
      RemoveHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler
      Console.WriteLine(message)
    End Sub
    venerdì 14 maggio 2010 11:31
  • Non puoi scrivere il seguente pezzo di codice :

    client = New WebClient()
      AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
      AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler
    
      Try
       client.DownloadFileAsync(New Uri("http://www.miosito.it/directory/file.txt"), "c:\miofile.txt")
       message = "File Scaricato correttamente!"
      Catch ex As Exception
       message = String.Format("Errore nel download del file [{0}]", ex.Message)
      End Try
    

    così come lo hai messo, devi inserirlo all'interno di una function o sub.

    venerdì 14 maggio 2010 11:57
    Moderatore
  • così?

    Module Module1
        Function client = New WebClient()
            AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCompletedHandler
            AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressChangedHandler

            Try
                client.DownloadFileAsync(New Uri("http://www.miosito.it/directory/file.txt"), "c:\miofile.txt")
                message = "File Scaricato correttamente!"
            Catch ex As Exception
                message = String.Format("Errore nel download del file [{0}]", ex.Message)
            End Try
    End Module

    venerdì 14 maggio 2010 12:07
  • Aspetta perchè c'è un pò di confuzione.

    Il tuo che genere di programma è? Si tratta di una console o di una windows Form?

    venerdì 14 maggio 2010 13:06
    Moderatore
  • allora se vuoi t mando il progetto via @ o altro... così puoi aiutarmi

    comunque è un windows form

    venerdì 14 maggio 2010 13:08
  • Puoi mandarmelo via mail a massimo.bonanni<at>domusdotnet.org (sostituisci <at> con @). Cercherò di darti una mano nei limiti del possibile (lavoro permettendo).

    venerdì 14 maggio 2010 13:37
    Moderatore
  • l'ho inviato

     

    venerdì 14 maggio 2010 13:51
  • ciao, scusa se te lo chiedo ma non potresti aiutarmi ora?, perche ho un a particolare urgenza,

    se puoi ovviamente

    sabato 15 maggio 2010 13:17
  • scusa, ma questo non è un servizio di consulenza a domicilio. :-)
    ieri Massimo era al lancio della nuova community romana DomusDotNet al
    Community Tour di Roma, e oggi sarà a farsi "gli affari suoi", visto
    che è sabato...
     
    --
    Lorenzo Barbieri
    Developer Evangelist - Microsoft Italia
    www.lorenzobarbieri.info
     
    Blog: http://www.geniodelmale.info
     
     
     
    sabato 15 maggio 2010 14:21
  • Sto vedendo il tuo progetto.
    Innanzitutto il controllo WebBrowser dovrebbe essere ancorato alla form perchè se la ridimensiono non viene ridimensionato.
    Il download dei file cel'hai già nel momento in cui cliccki o fai tasto destro su qualcosa di scaricabile.
    Il quale scenario ti serve il download a comando?

    sabato 15 maggio 2010 17:46
    Moderatore
  • il dowload dei file a me non risultava corretto, perchè nel momento del dowload, mi si apriva la finestralla di download di internet explorer

    questo browser non ha uno scopo specifico, insomma l'ho creato per semplificare l'uso, e non appesantire il pc, quindi chiunque può scaricarlo ed utilizzarlo, quindi il dowload dei file è del tutto casuale, non ce un indirizzo specifico da dove scaricare il file

    sabato 15 maggio 2010 18:21
  • Ho provato a vedere il tuo codice e mi sono permesso di fare alcune modifiche:

    1) ho tolto il tuo controllo webbrowser (di tipo DCOM) e ho messo il controllo nativo .NET (più semplice da gestire.

    2) al caricamento del document html, cerco di parserizzare l'html alla ricerca degli ancor (<a>) che puntano a file

    3) mostro i file così ricavati nella combo in alto a destra ed ho associato al tasto immediatamente a destra il download.

    Quello che dovresti fare è gestire l'errore di download, migliorare il parser dell'html, e fare in modo che la cartella di destinazione (ora c:\) sia configurabile dall'utente.

    Perdonami ma non ha molto senso, in termini didattici, realizzarti tutto il codice. Siamo a disposizione per tutto quello che serve e, poi, .......... è domenica :-)

    Scarica la solution da : http://www.megaupload.com/?d=XGQQFMSX

     

    P.S.: Un consiglio: dai ai controlli dei nomi che riconducano immediatamente alla loro funziona utilizzando delle naming convention (ad esempio un textbox fallo iniziare per txt).

    domenica 16 maggio 2010 16:02
    Moderatore
  • guarda, io per scaricare un file da internet, lo faccio in un modo semplicissimo, e uso una finestra del programma con una barra di progresso che ti informa a che punto è il download ... ecco il codice:

     

    Public Class Form1
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        My.Computer.Network.DownloadFile("http://file_da_scaricare", "destinazione file scaricato ocmpreso di estensione", "", "", True, 500, True)
        'in questo modo, c'è il download del file, nella cartwlla specificata e anche una nuova finestra che contiene una progressbar 
    'che ti informa del progresso di download, e un bottone annulla per annullare l'operazione di download
      End Sub
    End Class

    lunedì 17 maggio 2010 14:14
  • E' vero, però, in questo modo, non puoi personalizzare la tua finestra di download oppure non puoi, volendo, fare eseguire il download in backgrouind (non bloccando l'applicazione). In ogni caso funziona!
    lunedì 17 maggio 2010 18:33
    Moderatore
  • E' vero, però, in questo modo, non puoi personalizzare la tua finestra di download oppure non puoi, volendo, fare eseguire il download in backgrouind (non bloccando l'applicazione). In ogni caso funziona!
    dici a me?
    lunedì 17 maggio 2010 18:46
  • Si, volevo solo evidenziare che il metodo è assolutamente pertinente e funzionante.

    Sicuramente più facile di quello che ho proposto io, ma ha qualche svantaggio.

    Inoltre non amo molto utilizzare le classi presenti nei namespace Microsoft.XXXXX

    lunedì 17 maggio 2010 19:47
    Moderatore
  • e perchè devi evitarle? per fare del lavoro in più? :-)
     
    --
    Lorenzo Barbieri
    Developer Evangelist - Microsoft Italia
    www.lorenzobarbieri.info
     
    Blog: http://www.geniodelmale.info
     
     
     
    lunedì 17 maggio 2010 19:52
  • No, mi stanno antipatiche!!! :-)
    lunedì 17 maggio 2010 20:00
    Moderatore
  • se ci stanno antipatiche, non le usa, giusto?

    anche a me, ci sono cose che mi stanno antipatiche e non uso :-D

    comunque, dopo

     My.Computer.Network.DownloadFile("http://file_da_scaricare", "destinazione file scaricato ocmpreso di estensione", "", "", True, 500, True)
    faccio un if, e vedo se il file scaricato esiste, se si faccio compiere un'azione altrimenti un'altra ... più semplice di così :-)

    lunedì 17 maggio 2010 20:12
  • Infatti va benissimo, figurati.
    lunedì 17 maggio 2010 20:34
    Moderatore
  • Infatti va benissimo, figurati.
    dici di nuovo a me?
    martedì 18 maggio 2010 11:00