Загрузить файл через FTP из Excel VBA - PullRequest
2 голосов
/ 12 октября 2011

Необходимо загрузить файл (file.txt) на сервер (ftp.server.com) из Excel VBA.(необязательно должен быть FTP, просто нужно иметь возможность поместить файл туда и вернуть его, и у меня есть сервер на общем хостинге GoDaddy)

Я пытался запустить этот скрипт:

ftp -s:script.txt

script.txt:

open ftp.server.com
USER
PASS
lcd c:\
put file.txt
disconnect
bye

Ошибка, которую я получаю:

425 Не удалось открыть подключение для передачи данных к порту 53637: соединение установлено по времениout

Google говорит мне, что мне нужно перейти в пассивный режим, но клиент командной строки ftp.exe этого не позволяет.

Кто-нибудь знает о любом бесплатном (с открытым исходным кодом)) FTP-клиент командной строки, который допускает пассивный режим?

Есть ли у меня более простая альтернатива FTP?

Есть ли лучший способ загрузить файл через VBA (без обходного пути из командной строки)?

Я думаю об использовании DROPBOX (но я действительно не хочу устанавливать эту программу на все рабочие станции, которые будут нуждаться в этой программе).

Ответы [ 4 ]

6 голосов
/ 14 августа 2015

Если вы не можете использовать Windows ftp.exe (особенно потому, что не поддерживает пассивный режим и TLS / SSL), вы можете использовать другой клиент FTP командной строки.

Например, чтобы загрузить файл с использованием сценариев WinSCP , используйте:

Call Shell( _
    "C:\path\WinSCP.com /log=C:\path\excel.log /command " & _
    """open ftp://user:password@example.com/"" " & _
    """put C:\path\file.txt /path/"" " & _
    """exit""")

Чтобы упростить чтение, приведенные выше команды WinSCP запускаются:

open ftp://user:password@example.com/
put C:\path\file.txt /path/
exit

Вы можете поместить команды в файл сценария и запустить сценарий с параметром командной строки /script= , аналогично ftp -s: вместо /command.


См. Руководство к Преобразование сценария Windows FTP в сценарий WinSCP .

Вы даже можете GUI WinSCP сгенерировать сценарий загрузки FTP для вас.


WinSCP по умолчанию установлен в пассивный режим.

Вы также можете использовать FTPS (TLS / SSL) :

open ftpes://user:password@example.com/

В качестве альтернативы вы можете использовать Сборка WinSCP .NET через COM из кода VBA.


(я автор WinSCP)

4 голосов
/ 15 октября 2011

Диего, я успешно использовал приведенный ниже код годами. Код получает файлы с хоста, но я уверен, что его можно изменить, чтобы вместо него помещать файлы.

'Start Code
Set FSO = CreateObject("scripting.filesystemobject")

'**************************************************************************************    '***        Create FTP Action File & Initiate FTP File Transfer
'**************************************************************************************    VREDET = filename1 'Variable holding name of file to get

F = "C:\Volume\Temp\FTPScript.txt" 'creates the file that holds the FTP commands

Open F For Output As #1
Print #1, "open ftp.server" 'replace ftp.server with the server address
Print #1, ID 'login id here
Print #1, PW 'login password here
Print #1, "cd " & " Folder1" 'Directory of file location
Print #1, "cd " & " Folder2" 'Sub-Directory of file location
Print #1, "ascii"
Print #1, "prompt"
'Get the file from the host and save it to the specified directory and filename
Print #1, "get " & VREDET; " C:\some\directory\" & another-filename & ".CSV"
Print #1, "disconnect" 'disconnect the session
Print #1, "bye"
Print #1, "exit"
Close #1

'identify folder where ftp resides and execute the FTPScript.txt file
'vbHide - hides the FTP session

If FSO.FolderExists("C:\Windows\System32") = False Then
    Shell "C:\WINNT\system32\ftp.exe -s:C:\Volume\Temp\FTPScript.txt", vbHide
Else
    Shell "C:\WINDOWS\system32\ftp.exe -s:C:\Volume\Temp\FTPScript.txt", vbHide
End If
'end code
3 голосов
/ 12 октября 2011

http://winscp.net бесплатен, поддерживает сценарии, поддерживает пассивный режим и, безусловно, ОТЛИЧНО.

0 голосов
/ 15 августа 2014

Превосходный сценарий. Я использовал следующие команды для загрузки файлов, а также для записи выходных данных в файл, что полезно при отладке, и это распространенное заблуждение, что windows ftp не может сделать пассивный режим, команда для пассивной работы "quote pasv" (я добавил это к сценарию

Sub FtpFileto()
    Set FSO = CreateObject("scripting.filesystemobject")
    F = "C:\FTPScript.txt"
    ' Create the ftpscript to be run

    Open F For Output As #1
    Print #1, "open ftp.server.com" 'replace ftp.server with the server address
    Print #1, "ID" 'login id here
    Print #1, "PWD" 'login password here
    Print #1, "quote pasv" ' passive mode ftp if needed
    Print #1, "cd " & " /dir" 'Directory of file location
    Print #1, "cd " & " subdir" 'Sub-Directory of file location
    Print #1, "ascii"
    Print #1, "prompt"
    'Put the file from the host and save it to the specified directory and filename
    Print #1, "put " & VREDET; """C:\file1.csv"""; ""
    Print #1, "put " & VREDET; """C:\file2.csv"""; ""
    Print #1, "put " & VREDET; """C:\file3.csv"""; ""
    Print #1, "disconnect" 'disconnect the session
    Print #1, "bye"
    Print #1, "exit"
    Close #1
    'Now for the command to upload to the ftpsite and log it to a text file
    ' the trick is to use the standard command shell which allows logging

    Shell "cmd /c C:\WINDOWS\system32\ftp.exe -i -s:C:\FTPScript.txt > c:\ftpuploadlog.txt", vbHide

    End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...