Con risposta [VB 2010] Scaricare file da link diretto

  • mercoledì 4 luglio 2012 10:44
     
      Contiene codice

    ciao a tutti,

    Ho bisogno di scaricare un file in background con la mia applicazione e salvare questo in C:\Temp\MioFile.xls come posso fare?

    Ho gia provato cose del tipo:

    Dim W As New Net.WebClient
    W.Credentials = New Net.NetworkCredential("username", "password")
    W.DownloadFile(Link, whereToSave)

    ma ho sempre un messaggio del tipo:

    ************** Testo dell'eccezione **************
    System.Net.WebException: Eccezione durante una richiesta WebClient. ---> System.UnauthorizedAccessException: Accesso al percorso 'C:\OTV_DoNotRemove.xls' negato.
       in System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       in System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
       in System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
       in System.Net.WebClient.DownloadFile(Uri address, String fileName)
       --- Fine della traccia dello stack dell'eccezione interna ---
       in System.Net.WebClient.DownloadFile(Uri address, String fileName)
       in System.Net.WebClient.DownloadFile(String address, String fileName)
       in Excel.frmMain.btnScarica_Click(Object sender, EventArgs e)
       in System.Windows.Forms.Control.OnClick(EventArgs e)
       in System.Windows.Forms.Button.OnClick(EventArgs e)
       in System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       in System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       in System.Windows.Forms.Control.WndProc(Message& m)
       in System.Windows.Forms.ButtonBase.WndProc(Message& m)
       in System.Windows.Forms.Button.WndProc(Message& m)
       in System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       in System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       in System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    cosa posso fare?

Tutte le risposte

  • mercoledì 4 luglio 2012 11:03
     
      Contiene codice

    Se l'applicazione non gira con privilegi di administrator non può salvare in C:.

    Devi salvare in una directory consentita, guarda qui quella che si addice meglio alle tue esigenze, per ottenere il path guarda l'esempio su MSDN, per combinare il path della directory con quello del file usa Path.Combine, ad esempio:

    Dim path = Environment.GetFolderPath(Environment.SpecialFolder. LocalApplicationData)
    
    path = Path.Combine(path, "MyApp", "File.xlsx")

    Ovviamente devi creare la directory MyApp la prima volta.

     

    Matteo Migliore

    Bloghttp://blogs.ugidotnet.org/matteomigliore
    Twitterhttp://twitter.com/matteomigliore
    CodePlex


  • mercoledì 4 luglio 2012 11:48
     
      Contiene codice

    Ciao Matteo,

    diciamo che la locazione può essere un qualsiasi altro posto. Per ora questo non è il problema principale. Comunque ho provato le due righe di codice che mi hai scritto e mi compare il seguente errore.

    Combine non è un membro String

    Tornando al messaggio di errore che mi viene fuori quando provo a scaricare il file ecco qui un'immagine

  • mercoledì 4 luglio 2012 13:17
     
     

    Visual Basic è case-sensitive, quindi il codice che ti ha suggerito Matteo, che è in C#, in VB .NET dà problemi perché per quest'ultimo path e Path sono la "stessa cosa". In particolare, VB interpreta path come stringa, ma questo tipo non ha il metodo Combine, che invece è definito nell'oggetto Path contenuto nel namespace System.IO.

    Per risolvere, quindi, o cambi nome alla tua variabile (Dim path...) oppure accedi all'oggetto Path con il namespace completo: System.IO.Path.Combine.

    Detto questo, non ho capito una cosa: all'inizio parli del messaggio di "accesso al path negat"o, mentre nel tuo ultimo post hai mostrato un errore diverso. Puoi chiarire questa cosa?


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 5 luglio 2012 07:31
     
     

    Ciao Marco,

    Allora, il mio problema principale è quello di scaricare un file *.xls da un sito web https con protezione di autenticazione (username e password) e certificato. l'errore della path era perchè avevo provato il codice di Matteo e per rispondergli gli ho detto che mi veniva fuori quell'errore. Detto questo, come potrei fare per scaricare un file da una connessione di quel tipo?

  • giovedì 5 luglio 2012 07:46
     
     
    Quando dici "certificato" intendi che alla richiesta devi allegare un file CER?

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 5 luglio 2012 09:36
    Moderatore
     
     
    Solo per fare chiarezza:
    1) il primo errore era dovuto a quanto ti ha detto Matteo (se guardi l'eccezione
    ti sta dicendo che stai scrivendo in c:\ che non è fattibile).
    2) risolto quello hai l'errore sull'effettiva chiamata della classe WebClient
    al sito che dipende dal fatto che se hai un certificato non lo hai detto
    alla istanza della classe WebClient che stai usando.
     
    Non so se risolvono il tuo problema, ma prova a guardare:
     
     
  • venerdì 6 luglio 2012 07:41
     
     

    Quando Vado attravero il browser al link mi richiede di acquisire il certificato non so se hai presente (ecco qui un esempio).

  • mercoledì 11 luglio 2012 11:53
     
     Con risposta Contiene codice

    Eccomi ancora qui...

    Private Sub Download(ByVal Username As String, ByVal Password As String, ByVal columnName As String, ByVal NameJpg As String)
            Dim IndirizzoDelFile As String = "http://sito.it"
            Dim IndirizzoProxy As String = "http://proxy"
            Dim PortaProxy As Integer = 8080
    
            Dim MyProxy As New Net.WebProxy
            Dim cred As New Net.NetworkCredential(Username, Password, IndirizzoProxy)
            Dim MyStringWebReSource As String = Nothing
            Dim MyWebClient As New Net.WebClient
    
            AddHandler MyWebClient.DownloadFileCompleted, AddressOf MyWebClient_DownloadFileCompleted
            AddHandler MyWebClient.DownloadProgressChanged, AddressOf MyWebClient_DownloadProgressChanged
    
            MyWebClient.Proxy = MyProxy
            MyWebClient.Credentials = New Net.NetworkCredential(Username, Password)
            MyStringWebReSource = IndirizzoDelFile & "Image/" & columnName & "/" & NameJpg
            Dim PathJpg As String = frmMain.PathImage & "\" & columnName & "\" & NameJpg
            Try
                Dim u As Uri = New Uri(MyStringWebReSource)
                MyWebClient.DownloadFileAsync(u, PathJpg)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
            End Try
        End Sub
    
        Private Sub MyWebClient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
            'wClient_progress.Value = e.ProgressPercentage
        End Sub
    
        Private Sub MyWebClient_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
            If e.Cancelled Then
                'Una cancellazione?
                RaiseEvent UpdateLabel("Abort Download File ")
                Me.Close()
            ElseIf e.Error IsNot Nothing Then
                'Un'eccezione? 
                RaiseEvent UpdateLabel("Error During Download")
                Me.Close()
            Else
                'O semplicemente la fine delle operazioni            
                RaiseEvent UpdateLabel(String.Format("Successfully File Downloaded Image {0}"))
                MsgBox("carico")
            End If
        End Sub


    Il file ora lo riesco a scaricare tranquillamente... ora come potrei passare il paramentro

    PathJpg

    dalla procedura Dowload a

    MyWebClient_DownloadFileCompleted????

    dove vedete msgbox("carico") devo mettere l'istruzuzione che carica l'immagine nella form (picturebox.load(PathJpg))

    Cosa dovrei fare?

    vi ringrazio anticipatamente

    • Contrassegnato come risposta X-SL4UGHT3R mercoledì 11 luglio 2012 15:32
    •  
  • mercoledì 11 luglio 2012 12:31
     
     

    Puoi usare l'overload del metodo DownloadFileAsync a cui puoi passare un oggetto come terzo argomento: http://msdn.microsoft.com/it-it/library/ms144197.aspx.

    In particolare, nel tuo caso sarà il nome del file, che poi nell'evento DownloadCompleted puoi recuperare leggendo la proprietà UserState dell'oggetto AsyncCompletedEventArgs: http://msdn.microsoft.com/it-it/library/system.componentmodel.asynccompletedeventargs.userstate.aspx.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • mercoledì 11 luglio 2012 15:32
     
     Con risposta Contiene codice

    Puoi usare l'overload del metodo DownloadFileAsync a cui puoi passare un oggetto come terzo argomento: http://msdn.microsoft.com/it-it/library/ms144197.aspx.

    In particolare, nel tuo caso sarà il nome del file, che poi nell'evento DownloadCompleted puoi recuperare leggendo la proprietà UserState dell'oggetto AsyncCompletedEventArgs: http://msdn.microsoft.com/it-it/library/system.componentmodel.asynccompletedeventargs.userstate.aspx.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    Scusa marco! Sono stato proprio stupido:P

    c'è la proprietà e.UserState.ToString in

    Private Sub MyWebClient_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)

    Risolto!!:-)

    • Contrassegnato come risposta X-SL4UGHT3R mercoledì 11 luglio 2012 15:32
    •