2014-10-02 102 views
1

問題描述: 無法連接到FTPS服務器,這是一個私人服務器FTP Over SSL或FTPS。這是一個與HTTPS相同的安全連接。我正在使用的代碼成功連接到公共服務器。但似乎爲了連接到安全的FTPS服務器,我需要使用某種SSL加密。我完全不知道,我是java傢伙,但我被要求解決這個問題,學習新事物總是很有趣,而這次是VBA代碼。請幫助我VBA專家。Excel宏代碼連接到FTPS服務器,即FTP通過SSL而不是FTP服務器

有人可以告訴我什麼和代碼我應該修改或添加爲了連接到我的FTPS服務器。請再次注意我可以連接到FTP服務器,但不能連接到FTPS。

下面是我目前使用的代碼。這將是一個很大的幫助謝謝你!

'API code 

Private Type FILETIME 
    dwLowDateTime As Long 
    dwHighDateTime As Long 
End Type 

Private Const MAX_PATH = 260 
Private Type WIN32_FIND_DATA 
    dwFileAttributes As Long 
    ftCreationTime As FILETIME 
    ftLastAccessTime As FILETIME 
    ftLastWriteTime As FILETIME 
    nFileSizeHigh As Long 
    nFileSizeLow As Long 
    dwReserved0 As Long 
    dwReserved1 As Long 
    cFileName As String * MAX_PATH 
    cAlternate As String * 14 
End Type 


Private Declare Function InternetOpen _ 
    Lib "wininet.dll" _ 
    Alias "InternetOpenA" _ 
     (ByVal sAgent As String, _ 
     ByVal lAccessType As Long, _ 
     ByVal sProxyName As String, _ 
     ByVal sProxyBypass As String, _ 
     ByVal lFlags As Long) As Long 


     'Connect to the network 
Private Declare Function InternetConnect _ 
    Lib "wininet.dll" _ 
    Alias "InternetConnectA" _ 
     (ByVal hInternetSession As Long, _ 
     ByVal sServerName As String, _ 
     ByVal nServerPort As Integer, _ 
     ByVal sUsername As String, _ 
     ByVal sPassword As String, _ 
     ByVal lService As Long, _ 
     ByVal lFlags As Long, _ 
     ByVal lContext As Long) As Long 

     'Get a file using FTP 
Private Declare Function FtpGetFile _ 
    Lib "wininet.dll" _ 
    Alias "FtpGetFileA" _ 
     (ByVal hFtpSession As Long, _ 
     ByVal lpszremoteDir As String, _ 
     ByVal lpszNewFile As String, _ 
     ByVal fFailIfExists As Boolean, _ 
     ByVal dwFlagsAndAttributes As Long, _ 
     ByVal dwFlags As Long, _ 
     ByVal dwContext As Long) As Boolean 


     'Close the Internet object 
Private Declare Function InternetCloseHandle _ 
    Lib "wininet.dll" _ 
    (ByVal hInet As Long) As Integer 


     ' 
    Private Declare Function FtpFindFirstFile _ 
    Lib "wininet.dll" _ 
     Alias "FtpFindFirstFileA" _ 
     (ByVal hFtpSession As Long, _ 
     ByVal lpszSearchFile As String, _ 
     lpFindFileData As WIN32_FIND_DATA, _ 
     ByVal dwFlags As Long, _ 
     ByVal dwContent As Long) As Long 

     Private Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _ 
(ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long 

Private Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" _ 
(ByVal hConnect As Long, ByVal lpszDirectory As String) As Long 



'*************** 
'downloadFile method downloads files from a specified server through FTP 
'This method downloads files on only first level of specified directory on the server 
' 
' 
' 
' 
'*************** 

'*************** 
'To do 
' 
'1. if localDir does not include "\", it does not work - fixed 
'2. if folders exist on the remote server, it will not download 
' 
' 
'*************** 

'download files from a specified server 

Public Function downloadFiles(ServerName As String, UserName As String, Password As String, remoteDir As String, localDir As String, logFile As String) As Variant() 

Dim INet As Long 
Dim INetConn As Long 
Dim RetVal As Long 
Dim Success As Long 
Dim hFile As Long 
Dim w32FindData As WIN32_FIND_DATA 
Dim StrFile As String 
Dim fileList() As String 
Dim cnt As Long 
Dim gcnt As Long 
Dim i As Integer 
Dim curDir As Long 
Dim result(1) As Variant 


cnt = -1 
gcnt = 0 
RetVal = False 


Rem confirm local dir has \ at the end 

If Not Right(localDir, 1) = "\" Then 
    localDir = localDir + "\" 
End If 

'Test Code need to remove as the username and password are hardcoded 


INet = InternetOpen("MYFTP Control", 1&, vbNullString, vbNullString, 0&) 
    If INet > 0 Then 
     INetConn = InternetConnect(INet, ServerName, 0&, UserName, Password, 1&, 0&, 0&) 
     If INetConn > 0 Then 
      file.log "==== Connected to " & ServerName & "===", logFile 


     curDir = FtpSetCurrentDirectory(INetConn, remoteDir) 
     If (curDir <> 0) Then 
      file.log "current remote dir: " & remoteDir, logFile 
     End If 

      '''''''''''''''''''' 
      ''Create a list of files to download 
      '''''''''''''''''''' 


      'get file list 
      hFile = FtpFindFirstFile(INetConn, remoteDir, w32FindData, INTERNET_FLAG_RELOAD, 0&) 


      'create a list of files on the remote server 
     If hFile = 0 Then 
      file.log "cannot get a list of files", logFile 
     Else 

      Do 

       StrFile = Left(w32FindData.cFileName, InStr(w32FindData.cFileName, vbNullChar) - 1) 
       StrFile = Mid(StrFile, InStrRev(StrFile, " ") + 1) 

       'if the path is directory, skip this 
       If ((w32FindData.dwFileAttributes And &H10) <> &H10) Then 
        'strFile = strFile & "/" 


       cnt = cnt + 1 

       ReDim Preserve fileList(cnt) 
       fileList(cnt) = StrFile 
       Debug.Print StrFile 'Debug 

       End If 'end of skiping dir condition 

      Loop Until InternetFindNextFile(hFile, w32FindData) = 0 


      '''''''''''''''''''' 
      ''Download files on the list 
      '''''''''''''''''''' 
      For i = 0 To cnt 

       'set local file 
       StrFile = localDir & fileList(i) 

        'download a file 
        Success = FtpGetFile(INetConn, fileList(i), StrFile, False, FILE_ATTRIBUTE_NORMAL, BINARY_TRANSFER, 0&) 

        If Success > 0 Then 
        file.log fileList(i) & " is downloaded", logFile 
        gcnt = gcnt + 1 

        Else 
        file.log fileList(i) & " is Not downloaded", logFile 

        End If 

      Next 


     End If 

     RetVal = InternetCloseHandle(INet) 


     Else 


     'cannot connet to the server error message 
     file.log "Client cannnoot connet to " & ServerName, logFile 
     RetVal = InternetCloseHandle(INet) 

     End If 

    End If 




result(0) = cnt + 1 
result(1) = gcnt 


file.log ServerName & " - " & "Downloaded files: " & CStr(result(1)) & " out of " & CStr(result(0)), logFile 

     If RetVal > 0 Then 
      file.log "===Connection is closed===", logFile 
     Else 
      file.log "===Connection is not closed correctly===", logFile 
     End If 


downloadFiles = result 


End Function 

Private Function log(warnLevel As String, info As String, fileName As String) 




End Function 

Private Function msg(info As String) 

    MsgBox info 

End Function 
+0

我不相信這是支持的。 – admdrew 2014-10-02 20:16:21

+0

您的意思是說,Excel宏代碼不支持連接到FTPS服務器?它只能連接到FTP服務器? – Sourav 2014-10-02 20:20:31

+0

根據一些非常粗略的研究,似乎'wininet.dll'不支持SSL over FTP。 – admdrew 2014-10-02 20:25:55

回答