Невозможно получить файлы из ftp, используя vba - PullRequest
0 голосов
/ 26 февраля 2020

Я хочу загрузить изображение с ftp, чтобы позже использовать его в отчете о доступе, проблема в том, что ftpgetFile возвращает 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 возвращает 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)

Большое спасибо всем за ваши ответы.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Третий lpszNewFile аргумент FtpGetFile - это путь к файлу, а не каталогу.

Таким образом, он должен выглядеть следующим образом:

Call FTPGetFile(hConn, id, "C:\Documents and Settings\Adrian\Mis documentos\Descargas\" & id, ...)

Также, как правило, вы должны использовать INTERNET_FLAG_PASSIVE с InternetConnect.

Без флага InternetConnect по умолчанию активен, что в большинстве случаев невозможно. когда задействован брандмауэр или NAT.

0 голосов
/ 26 февраля 2020

Мы успешно используем этот вариант:

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
...