[VB 2010] Scaricare file da link diretto
-
mercoledì 4 luglio 2012 10:44
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
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- Modificato Matteo Migliore mercoledì 4 luglio 2012 11:04
-
mercoledì 4 luglio 2012 11:48
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:46Quando 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:36ModeratoreSolo per fare chiarezza:1) il primo errore era dovuto a quanto ti ha detto Matteo (se guardi l'eccezioneti sta dicendo che stai scrivendo in c:\ che non è fattibile).2) risolto quello hai l'errore sull'effettiva chiamata della classe WebCliental sito che dipende dal fatto che se hai un certificato non lo hai dettoalla 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
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 paramentroPathJpg
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
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: @marcominervaScusa 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

