Перейти к основному содержимому

Выполнение команды FTP (ftp.cmd)

Объявление​

result, err = ftp.cmd(URL, cmd [, connectTimeoutSec ])

Параметры​

  • URL
    Текст. Удалённый URL FTP, включающий имя пользователя и пароль. Для операций с каталогами используйте URL каталога, заканчивающийся на /.
  • cmd
    Текст. Одна команда протокола FTP, например MKD test. Передача таблицы команд не поддерживается.
  • connectTimeoutSec
    Вещественное число, необязательный параметр. Время ожидания соединения в секундах, по умолчанию 10. Не ограничивает общую продолжительность запроса.

Возвращаемые значения​

  • result
    Текст или nil. При успешном запросе возвращает полученные данные, в том числе пустую строку. Для URL каталога это обычно список содержимого каталога, а не код состояния команды FTP или ответ управляющего соединения. При ошибке возвращает nil.
  • err
    Текст или nil. При ошибке возвращает текстовое описание её причины. При успехе второе значение не возвращается, поэтому принимающая его переменная равна nil.

Описание​

Отправляет команду серверу FTP для выполнения операций, например создания каталогов. Операции выполняются над файлами или каталогами на сервере.

Команда выполняется до перехода в каталог, указанный в URL. Относительные пути отсчитываются от каталога по умолчанию после входа; например, MKD uploads/test создаёт test внутри uploads в этом каталоге. Не рассчитывайте, что путь в URL изменит рабочий каталог команды. Пути в команде отправляются напрямую, без процентного декодирования URL.

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

В текущей реализации, если текст команды содержит LIST или NLST в верхнем регистре, команда не отправляется; выполняется только запрос по умолчанию для URL. Это относится и к случаям, когда такие подстроки встречаются в имени каталога. Поэтому NLST не переключает вывод на список только имён файлов, а аргументы LIST -a не действуют.

После выполнения команды функция всё равно запрашивает данные по URL; для URL каталога она также получает список его содержимого. Если затем произойдёт ошибка получения списка или соединения для передачи данных, каталог может быть уже создан, но функция всё равно вернёт nil и сообщение об ошибке.
Эта функция может уступать выполнение; другие потоки могут выполняться до её возврата.

Простой пример​

Укажите имя пользователя и пароль в URL. Формат следующий (части в квадратных скобках необязательны):

ftp://[user:password@]host[:port]/path

Если имя пользователя или пароль содержит @, : или /, экранируйте их как %40, %3A или %2F соответственно. Другие недопустимые в URL символы можно кодировать с помощью процентного кодирования. Например, с именем пользователя havonz и паролем 11@@22 создайте test в каталоге по умолчанию после входа:

local result, err = ftp.cmd("ftp://havonz:11%40%[email protected]/", "MKD test", 10)
if result == nil then
sys.alert("Ошибка создания: " .. tostring(err))
else
sys.alert("Успешно создано")
end

Сложный пример​

Последовательно создайте demo и demo/logs; оба каталога должны ещё не существовать. При ошибке на любом шаге выполнение прекращается. Ранее созданные каталоги автоматически не удаляются.

local url = "ftp://havonz:11%40%[email protected]/"

for _, path in ipairs({ "demo", "demo/logs" }) do
local result, err = ftp.cmd(url, "MKD " .. path, 10)
if result == nil then
sys.alert("Ошибка создания " .. path .. ": " .. tostring(err))
return
end
end

sys.alert("Каталоги созданы")

Примечание: В коде выше используется sys.alert, функция из другой главы.