mail mail

Работа с FTP из VBA (без использования WinAPI)

Представляю вашему вниманию инструментарий для работы с файлами по FTP, не требующий использования системных функций (WinAPI)

Как известно, отправить файл на FTP сервер (или загрузить файл с FTP, создать папку на FTP сервере, и т.д.) можно при помощи таких API-функций из библиотеки wininet.dll, как FtpPutFile, FtpGetFile, FtpRenameFile, FtpDeleteFile, FtpRemoveDirectory, FtpCreateDirectory, FtpFindFirstFile и т.д.

Как именно использовать эти функции - можете посмотреть в коде надстройки для отправки файлов Excel на FTP сервер

В чем недостаток этого способа - так это в необходимости обеспечения совместимости кода с различными платформами.
В частности, чтобы код с функциями API работал и в Office 2010, и в 64-битной Windows, необходимо заметно увеличить объём кода. А, поскольку описание этих функций из wininet.dll и без того занимает много места (а универсальный код вообще займёт сотню строк), да и надо ещё и разбираться во всех этих функциях, т.к. в разных версиях Windows возможны различия в способе вызова функций из wininet.dll, и были созданы аналоги этих функций для работы с FTP, не использующие WinAPI

Сподвигла меня на это решение необходимость реализации средств обновления надстроек Excel, где необходимо было реализовать функционал отправки файлов Excel на FTP сервер, причем так, чтобы это стабильно работало на всех компьютерах. Попутно, кстати, родилась и функция загрузки файла с сервера без использования WinAPI, которая тоже вошла в состав данного инструментария.

 

Основу предлагаемого мной решения составляет модуль класса FTPcommander, который предоставляет вам следующие функции:

  • Function DownloadFile(ByVal FtpFolder$, ByVal FtpFilename$, ByVal LocalPath$) As Boolean
    (Функция скачивает файл с FTP-сервера с именем FtpFilename$ из папки FtpFolder$. Скачанный файл сохраняется на компьютере под именем (и по пути) LocalPath$. Функция возвращает TRUE, если загрузка файла завершилась успешно)
  • Function UploadFile(ByVal LocalPath$, Optional ByVal FtpFolder$, Optional ByVal FtpFilename$ = "") As String
    (Функция загружает файл LocalPath$ по FTP на сервер в папку FtpFolder$. Если задан параметр FtpFilename$, отправленный файл получает имя FtpFilename$. Функция возвращает ссылку на файл, если закачка файла завершилась успешно)
  • Function CreateNewFolder(ByVal FtpFolder$) As Boolean
    (Функция создаёт папку FtpFolder$ на FTP сервере. Возвращает TRUE, если папка была успешно создана, или существовала ранее)
  • Function DeleteFile(ByVal FtpFolder$, ByVal FtpFilename$) As Boolean
    (Функция создаёт папку FtpFolder$ на FTP сервере. Возвращает TRUE, если папка была успешно создана, или существовала ранее)
  • Function DownloadFileFromURL(ByVal URL$, ByVal LocalPath$) As Boolean
    (Функция скачивает файл по ссылке URL$, и сохраняет его по пути LocalPath$. Возвращает TRUE, если файл был успешно загружен)
  • Функция GetLastError возвращает информацию об ошибке, если некая функция была завершена некорректно (возвратила FALSE)

Дополнительно в составе модуля класса есть функции чтения и записи текстовых файлов ReadTXTfile и SaveTXTfile, а также функции перекодировки файлов и текста ChangeFileCharset и ChangeTextCharset

 

Как использовать модуль класса FTPcommander для работы с файлами по FTP:

1) Откройте прикреплённый к статье файл Excel, и мышом перетащите модуль класса FTPcommander в свой файл

2) Пропишите настройки FTP аккаунта в специальной функции, или сохраните их в реестре Windows
(подробнее об этом - ниже)

3) В своём макросе создаёте экземпляр класса FTPcommander, и используете его методы для работы с файлами
Создать экземпляр класса вам поможет следующий код:  Dim FTP As New FTPcommander
Примеры макросов отправки и скачивания файлов доступны в прикреплённом файле
(в модуле mod_TestFTP):

Вот один из примеров использования класса FTPcommander:

Private Sub ЗагрузкаФайлаНаFTPсервер()
    ' Этот макрос загружает файл "C:\ПЖиВ.jpg" в корневую папку FTP сервера,
   ' переименовывая файл в "ER"
   Dim FTP As New FTPcommander
    Link$ = FTP.UploadFile("C:\ПЖиВ.jpg", , "ER")
   
    ' В переменную Link$ возвращается ссылка вида "http://u3661.seiko.vps-private.net/ER",
   ' по которой доступен загруженный через FTP файл
End Sub

Как видите, всего 2 строки кода, - и ваш файл оказался загружен на FTP сервер.

Ещё один пример использования:

Private Sub ЗагрузкаСПоследующимСкачиваниемФайла()
    Dim FTP As New FTPcommander
    fn$ = "C:\Documents and Settings\Admin\Рабочий стол\stamp.png"

    ' отправляем файл с рабочего стола на FTP сервер
   ' (на сервере файл получит имя "1 2 3.png")
   Link$ = FTP.UploadFile(fn$, , "1 2 3.png")
    If Len(Link$) Then
        Debug.Print "Загруженный файл доступен по ссылке: ", Link$
    Else
        Debug.Print "Ошибка: ", FTP.GetLastError
    End If

    ' а теперь скачиваем с сервера ранее загруженный файл "1 2 3.png"
   ' Скачанный файл окажется в той же папке (Рабочий стол),
   ' и получит имя "stamp.png222"
   res = FTP.DownloadFile("", "1 2 3.png", fn$ & "222")
    If res Then
        Debug.Print "Файл успешно загружен с FTP"
    Else
        Debug.Print "Ошибка: ", FTP.GetLastError
    End If
End Sub

 

Есть 2 способа задать настройки FTP аккаунта для использования объектом FTPcommander:

 

1 способ - один раз запустить макрос следующего вида:

Sub Save_FTP_Account_Information()    ' достаточно запустить ОДИН РАЗ!
   ' Cохраняем в реестре Windows настройки FTP-аккаунта по-умолчанию
   SaveSetting Application.Name, "FTP", "Host", "Имя или IP адрес сервера FTP"
    SaveSetting Application.Name, "FTP", "Login", "Имя пользователя (логин)"
    SaveSetting Application.Name, "FTP", "Password", "Пароль к FTP серверу"
    SaveSetting Application.Name, "FTP", "BaseFolder", "путь к стартовой папке, например, /www/"
    SaveSetting Application.Name, "FTP", "BaseURL", "http://Адрес Вашего Сайта, куда будут закачиваться файлы/"
End Sub

Этот макрос запишет все необходимые настройки в реестр Windows, и впоследствии будет брать их оттуда

Преимущество этого способа: один раз запустили макрос, потом удалили его, - и можно нигде в коде не прописывать секретные данные FTP аккаунта

Недостаток этого способа: при хранении настроек в реестре, возможен доступ только к одному FTP серверу

 

2 способ - для инициализации объекта FTPcommander использовать специальные функции с настройками:

Function MyFTPaccount() As FTPcommander
    ' возвращает объект типа FTPcommander, с нужными настройками
   Set MyFTPaccount = New FTPcommander
    With MyFTPaccount
        .Host = "Имя или IP адрес сервера FTP"
        .Login = "Имя пользователя (логин)"
        .Password = "Пароль к FTP серверу"
        .BaseFolder = "путь к стартовой папке, например, /www/"
        .BaseURL = "http://Адрес Вашего Сайта, куда будут закачиваться файлы/"
    End With
End Function

Пример использования функции:

Sub test()
    Dim FTP As FTPcommander    ' объявляем переменную
   Set FTP = MyFTPaccount    ' создаём объект с нужными настройками
   FTP.UploadFile ("C:\123.jpg")    ' отправляем файл на сервер
End Sub

Преимущества этого способа: возможно работать с несколькими FTP серверами одновременно, конфиденциальные данные (настройки FTP аккаунта) не хранятся в открытом виде в реестре

Недостаток этого способа: настройки FTP аккаунта хранятся в коде VBA - если файл попадёт постороннему человеку, он легко сможет добраться до этих настроек (как известно, любые пароли на VBA ломаются за секунду)

ВложениеРазмер
FTP.xls45.5 КБ

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Сервер рабочий. Работает без пароля.
Уж и так и сяк пробовал менять параметры.

Как именно пробовали?

Вообще, зачем вам менять какие-то параметры, если файл скачивается без пароля? (по ссылке?)

Есть же простенький код для скачивания файла по ссылке

 

Если же ваша задача по каким-то причинам таким способом не решается (ваш сервер не отдаёт файл через веб-интерфейс), то, больше чем уверен - ошибка в 5 строчках настроек.

В этом случае, отправьте мне на почту (попробую помочь):

  1. ваш файл с модулем класса и макросами
  2. объяснение, что должен делать макрос
  3. все необходмые учётные данные для вашего FTP сервера

 

Полезная штука.
Пробую использовать - файл не скачивается с фтп-сервера.
Сервер рабочий. Работает без пароля.
Уж и так и сяк пробовал менять параметры.
Может в формате входных данных дело? Он недостаточно описан здесь.
Сообщений не выдаёт, только во время выполнения читаю в переменной res$ - "неизвестный узел"
А в конце - окно с восклицанием.
vic
03/01/2012

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
4 + 0 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.