Работа с FTP из VBA (без использования WinAPI)
- Инструменты разработчика VBA
- Макросы VBA Excel
- Скачивание файлов
- Разное
- Интернет
- Логин и пароль
- Работа с FTP
- Текстовые файлы
- Модули класса
- Работа с файлами
|
Представляю вашему вниманию инструментарий для работы с файлами по 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.xls |
45.5 КБ |
36 |
48 недель 5 дней назад |
ftp_new_version_WinAPI.xlsb |
89.81 КБ |
0 |
Ещё не загружался |
|