无法使用 vba 从 ftp 获取文件
Cannot get files from ftp using vba
我想从 ftp 下载图像以便稍后在访问报告中使用它,问题是 ftpgetFile returning 0 而不是在文件夹。
Public Function RecuperarFirmaMuestreadores(userID As Long)
Dim firma As String
Dim id As String
id = CStr(userID) & ".jpg"
sign = ftpfirma("XXX.XX.XXX.XXX", "User", "password", "/document/", id)
End Function
Function ftpfirma(ByVal HostName As String, ByVal Username As String, ByVal Password As String, ByVal sDir As String, id As String) As String
Dim sOrgPAth As String
Dim pData As WIN32_FIND_DATA
Dim hFind As Long, lRet As Long
Dim hConnection, hOpen, hFile As Long
Dim sFiles() As String
Dim firma As Long
sPath = String(MAX_PATH, 0)
hOpen = InternetOpen("FTPGET", 1, vbNullString, vbNullString, 1)
hConn = InternetConnect(hOpen, HostName, INTERNET_DEFAULT_FTP_PORT, Username, Password, 1, 0, 2)
' Change Directory
Call FtpSetCurrentDirectory(hConn, sDir)
' get list of directory
Call FtpGetCurrentDirectory(hConn, sPath, Len(sPath))
Call FTPGetFile(hConn, id, "C:\Documents and Settings\Adrian\Mis documentos\Descargas", True, 0, 0 Or GENERIC_READ, 0)
' Close Internet Connection
Call InternetCloseHandle(hOpen)
Call InternetCloseHandle(hConn)
End Function
在 ftp 中存在图像,它位于 /documents 中,名称类似于 123.jpg,我正在下载到我的下载文件夹中,但我没有遇到错误。
提前致谢。
编辑
我试了你说的但是没用,getLastError return 0
Call FTPGetFile(hConn, id, "C:\Documents and Settings\Adrian\Mis documentos\Descargas\" & id, True, 0, INTERNET_FLAG_PASSIVE, 0)
e = getLastError()
马丁给出的解决方案
确保标志值不是像这种情况下的 0,而是 INTERNET_FLAG_PASSIVE
hConn = InternetConnect(hOpen, HostName, INTERNET_DEFAULT_FTP_PORT, Username, Password, 1, INTERNET_FLAG_PASSIVE, 2)
非常感谢大家的回答。
我们成功地使用了这个变体:
Private Const FTP_TRANSFER_TYPE_UNKNOWN As Long = 0
Private Const INTERNET_FLAG_RELOAD As Long = &H80000000
<snip>
If FtpGetFileA(hConn, strRemoteFile, strLocalFile, 1, 0, FTP_TRANSFER_TYPE_UNKNOWN Or INTERNET_FLAG_RELOAD, 0) Then
Debug.Print "done"
Else
Debug.Print "fail"
End If
FtpGetFile
的第三个 lpszNewFile
参数是文件路径,而不是目录。
所以它应该是这样的:
Call FTPGetFile(hConn, id, "C:\Documents and Settings\Adrian\Mis documentos\Descargas\" & id, ...)
此外,一般来说,您应该使用 INTERNET_FLAG_PASSIVE
和 InternetConnect
。
没有标志,InternetConnect
默认为活动模式,当涉及防火墙或 NAT 时,该模式几乎不可用。
我想从 ftp 下载图像以便稍后在访问报告中使用它,问题是 ftpgetFile returning 0 而不是在文件夹。
Public Function RecuperarFirmaMuestreadores(userID As Long)
Dim firma As String
Dim id As String
id = CStr(userID) & ".jpg"
sign = ftpfirma("XXX.XX.XXX.XXX", "User", "password", "/document/", id)
End Function
Function ftpfirma(ByVal HostName As String, ByVal Username As String, ByVal Password As String, ByVal sDir As String, id As String) As String
Dim sOrgPAth As String
Dim pData As WIN32_FIND_DATA
Dim hFind As Long, lRet As Long
Dim hConnection, hOpen, hFile As Long
Dim sFiles() As String
Dim firma As Long
sPath = String(MAX_PATH, 0)
hOpen = InternetOpen("FTPGET", 1, vbNullString, vbNullString, 1)
hConn = InternetConnect(hOpen, HostName, INTERNET_DEFAULT_FTP_PORT, Username, Password, 1, 0, 2)
' Change Directory
Call FtpSetCurrentDirectory(hConn, sDir)
' get list of directory
Call FtpGetCurrentDirectory(hConn, sPath, Len(sPath))
Call FTPGetFile(hConn, id, "C:\Documents and Settings\Adrian\Mis documentos\Descargas", True, 0, 0 Or GENERIC_READ, 0)
' Close Internet Connection
Call InternetCloseHandle(hOpen)
Call InternetCloseHandle(hConn)
End Function
在 ftp 中存在图像,它位于 /documents 中,名称类似于 123.jpg,我正在下载到我的下载文件夹中,但我没有遇到错误。
提前致谢。
编辑
我试了你说的但是没用,getLastError return 0
Call FTPGetFile(hConn, id, "C:\Documents and Settings\Adrian\Mis documentos\Descargas\" & id, True, 0, INTERNET_FLAG_PASSIVE, 0)
e = getLastError()
马丁给出的解决方案
确保标志值不是像这种情况下的 0,而是 INTERNET_FLAG_PASSIVE
hConn = InternetConnect(hOpen, HostName, INTERNET_DEFAULT_FTP_PORT, Username, Password, 1, INTERNET_FLAG_PASSIVE, 2)
非常感谢大家的回答。
我们成功地使用了这个变体:
Private Const FTP_TRANSFER_TYPE_UNKNOWN As Long = 0
Private Const INTERNET_FLAG_RELOAD As Long = &H80000000
<snip>
If FtpGetFileA(hConn, strRemoteFile, strLocalFile, 1, 0, FTP_TRANSFER_TYPE_UNKNOWN Or INTERNET_FLAG_RELOAD, 0) Then
Debug.Print "done"
Else
Debug.Print "fail"
End If
FtpGetFile
的第三个 lpszNewFile
参数是文件路径,而不是目录。
所以它应该是这样的:
Call FTPGetFile(hConn, id, "C:\Documents and Settings\Adrian\Mis documentos\Descargas\" & id, ...)
此外,一般来说,您应该使用 INTERNET_FLAG_PASSIVE
和 InternetConnect
。
没有标志,InternetConnect
默认为活动模式,当涉及防火墙或 NAT 时,该模式几乎不可用。