FTP - Downloading Files

di il
4 risposte

FTP - Downloading Files

Salve ragazzi,

Chiedo il vostro aiuto in quanto sto riscontrando un problema con un programmino scritto in visual basic quale, mediante connessione FTP, mi permette di scaricare file conservati in un NAS. Buttando giù due righe di codice(stavo effettuando delle prove e quindi nulla di ufficiale), incontro il problema quando vado a scaricare fisicamente questo file. Infatti, non appena confermo l'intenzione di voler effettuare il download, mi restituisce una stringa di errore:

"Connessione sottostante chiusa: il server ha commesso una violazione del protocollo"...

Ho pensato potesse esser un problema di autorizzazioni, legato al server quindi, ma usando filezilla così come WinSCP non ho alcun problema e riesco a fare download di qualsiasi tipologia di file. Ho cercato aiuto altrove ma, tutte le prove effettuate, non hanno portato nessun risultato ahimè. Qualcuno potrebbe aiutarmi?

Posto il codice e la DLL usata per FTP
https://pastebin.com/m2MEvDx
DLL: FtpClientVB.dll

Grazie anticipatamente

4 Risposte

  • Re: FTP - Downloading Files

    Salve.
    personalmente, nel caso specifico, non ho usato altro che FTPWebRequest...
    brutalmente, cannibalizzando del vecchio codice che scrissi tanto tempo fa,
    
    Dim hostName As String = e.HostName.Replace("\", "/")
    Dim hostPath As String = e.HostPath.Replace("\", "/")
    If Not String.IsNullOrEmpty(hostPath) Then
        If hostPath.StartsWith("/") Then hostPath = hostPath.Substring(1)
        If Not hostPath.EndsWith("/") Then hostPath &= "/"
    Else
        If Not hostName.EndsWith("/") Then hostName &= "/"
    End If
    
    Dim uploadUrl As String = hostName
    Dim newUriPort As UriBuilder = New UriBuilder(uploadUrl)
    newUriPort.Port = portNr
    
    uploadUrl = newUriPort.Uri.ToString & hostPath & e.FileName
    
    Dim Request As FtpWebRequest = CType(WebRequest.Create(ourUri), FtpWebRequest)
    Request.Method = WebRequestMethods.Ftp.DownloadFile
    
    ' UploadFile is not supported through an Http proxy
    ' so we disable the proxy for this request.
    Request.Proxy = Nothing
    Request.Timeout = xxxx
    
    Request.Credentials = New Net.NetworkCredential("user", "Password")
    Request.ReadWriteTimeout = xxx
    Request.UseBinary = true/false
    Request.UsePassive = true/false
    Request.KeepAlive = True
    
    Try
        Using response As FtpWebResponse = CType(Request.GetResponse, FtpWebResponse)
            Using responseStream As Stream = response.GetResponseStream
                'loop to read & write to file
                Using fs As New FileStream(Path.Combine("LocalPath", "FileName"), FileMode.OpenOrCreate)
                    Try
                        Dim buffer(2047) As Byte
                        Dim read As Integer = 0
                        Do
                            read = responseStream.Read(buffer, 0, buffer.Length)
                            fs.Write(buffer, 0, read)
                        Loop Until read = 0
                        responseStream.Close()
                        fs.Flush()
                        fs.Close()
    
                    Catch ex As Exception
                        'catch error and delete file only partially downloaded
                        fs.Close()
                        'delete target file as it's incomplete
    
                        Try
                            File.Delete(Path.Combine(e.LocalPath, e.FileName))
                        Catch ex1 As Exception
                            Debug.Write(ex1.Message)
                        End Try
    
                    End Try
                End Using
                responseStream.Close()
            End Using
            response.Close()
        End Using
    Catch ex As Exception
        Debug.Write(ex.Message)
    End Try
    
    Request = Nothing
    
    non ho guardato il tuo codice... troppo pigro a quest'ora
    salutoni omnia
    --
    Andrea
  • Re: FTP - Downloading Files

    asql ha scritto:


    Salve.
    personalmente, nel caso specifico, non ho usato altro che FTPWebRequest...
    brutalmente, cannibalizzando del vecchio codice che scrissi tanto tempo fa,
    
    Dim hostName As String = e.HostName.Replace("\", "/")
    Dim hostPath As String = e.HostPath.Replace("\", "/")
    If Not String.IsNullOrEmpty(hostPath) Then
        If hostPath.StartsWith("/") Then hostPath = hostPath.Substring(1)
        If Not hostPath.EndsWith("/") Then hostPath &= "/"
    Else
        If Not hostName.EndsWith("/") Then hostName &= "/"
    End If
    
    Dim uploadUrl As String = hostName
    Dim newUriPort As UriBuilder = New UriBuilder(uploadUrl)
    newUriPort.Port = portNr
    
    uploadUrl = newUriPort.Uri.ToString & hostPath & e.FileName
    
    Dim Request As FtpWebRequest = CType(WebRequest.Create(ourUri), FtpWebRequest)
    Request.Method = WebRequestMethods.Ftp.DownloadFile
    
    ' UploadFile is not supported through an Http proxy
    ' so we disable the proxy for this request.
    Request.Proxy = Nothing
    Request.Timeout = xxxx
    
    Request.Credentials = New Net.NetworkCredential("user", "Password")
    Request.ReadWriteTimeout = xxx
    Request.UseBinary = true/false
    Request.UsePassive = true/false
    Request.KeepAlive = True
    
    Try
        Using response As FtpWebResponse = CType(Request.GetResponse, FtpWebResponse)
            Using responseStream As Stream = response.GetResponseStream
                'loop to read & write to file
                Using fs As New FileStream(Path.Combine("LocalPath", "FileName"), FileMode.OpenOrCreate)
                    Try
                        Dim buffer(2047) As Byte
                        Dim read As Integer = 0
                        Do
                            read = responseStream.Read(buffer, 0, buffer.Length)
                            fs.Write(buffer, 0, read)
                        Loop Until read = 0
                        responseStream.Close()
                        fs.Flush()
                        fs.Close()
    
                    Catch ex As Exception
                        'catch error and delete file only partially downloaded
                        fs.Close()
                        'delete target file as it's incomplete
    
                        Try
                            File.Delete(Path.Combine(e.LocalPath, e.FileName))
                        Catch ex1 As Exception
                            Debug.Write(ex1.Message)
                        End Try
    
                    End Try
                End Using
                responseStream.Close()
            End Using
            response.Close()
        End Using
    Catch ex As Exception
        Debug.Write(ex.Message)
    End Try
    
    Request = Nothing
    
    non ho guardato il tuo codice... troppo pigro a quest'ora
    salutoni omnia
    --
    Andrea


    Ciao Andrea, grazie per la risposta celere.. prima di usare quella DLL, avevo usato il metodo da te indicato e anche il webclient, ma quando provo a scaricare il file, con il primo metodo mi restituisce sempre l'errore sopra menzionato, mentre con il webclient dà errore di accesso negato alla cartella di destinazione. Nonostante abbia modificato gli accessi alla cartella così come all'exe, questo errore persiste.
    Grazie ancora

    Saluti
  • Re: FTP - Downloading Files

    Buonasera,


    Il problema sopra menzionato è stato risolto modificando il framework di destinazione da 4.5 a 3.5
    Personalmente si può ritenere chiuso e concluso questo post da me creato.

    Grazie per la collaborazione,

    Saluti
  • Re: FTP - Downloading Files

    Ti posto anche il mio esempio, personalmente io mi avvalgo di winscp
    
     Using session As New Session
                    ' Connect
                    session.ExecutablePath = "C:\WinSCP\WinSCP.exe"
                    AddHandler session.FileTransferProgress, AddressOf SessionFileTransferProgress
                    AddHandler session.FileTransferred, AddressOf FileTransferred
                    session.Open(sessionOptions)
    
                    ' Download files
                    Dim transferOptions As New TransferOptions
                    transferOptions.TransferMode = TransferMode.Binary
    
                    Dim transferResult As TransferOperationResult
                    transferResult =
                        session.GetFiles("/ftp/xxxxxxxxxx/Fatture Elettroniche Fornitori/FA/*", "F:\XXX\AT\Account Payable\", True, transferOptions)
                    ' Throw on any error
                    transferResult.Check()
                    ' Print results
                    For Each transfer In transferResult.Transfers
                        Console.WriteLine("Download of {0} succeeded", transfer.FileName)
                        sw1 = File.AppendText(strFile1)
                        sw1.WriteLine("Download of {0} succeeded -" & DateTime.Now & "-" & transfer.FileName)
                        sw1.Close()
                    Next
                    If ProgressBar1.Value = ProgressBar1.Maximum Then
                        ProgressBar1.Value = 1
                        ProgressBar1.PerformStep()
                    Else
                        ProgressBar1.PerformStep()
                    End If
                End Using
                
                
Devi accedere o registrarti per scrivere nel forum
4 risposte