ftp_put()
Функция ftp_put() в PHP загружает локальный файл на удалённый FTP-сервер. Разбираем синтаксис, режимы передачи и обработку ошибок.
Функция PHP ftp_put()
ftp_put() — встроенная PHP-функция, которая загружает локальный файл на удалённый FTP-сервер. Это аналог загрузки для ftp_get(), который скачивает удалённый файл на ваш компьютер. На этой странице рассматриваются сигнатура, режимы передачи, полный рабочий пример, обработка ошибок и типичные ловушки в продакшене.
Функция ftp_put() вызывается после установки соединения с помощью ftp_connect() и аутентификации через ftp_login().
Синтаксис
ftp_put(
FTP\Connection $ftp,
string $remote_filename,
string $local_filename,
int $mode = FTP_BINARY
): bool| Параметр | Описание |
|---|---|
$ftp | Дескриптор FTP-соединения, возвращаемый ftp_connect() или ftp_ssl_connect(). |
$remote_filename | Путь назначения на сервере, например /public_html/index.html. |
$local_filename | Путь источника на вашем компьютере, например ./build/index.html. |
$mode | Режим передачи: FTP_BINARY (по умолчанию) или FTP_ASCII. Необязателен начиная с PHP 7.3. |
Возвращает true при успехе и false при ошибке.
Замечание о версиях: До PHP 8.1 первым аргументом был
resource, возвращаемыйftp_connect(). Начиная с PHP 8.1 это объектFTP\Connection. Код не меняется — вы по-прежнему передаёте то, что возвращаетftp_connect(), — однако проверки черезis_resource()перестают работать.
Режим Binary и ASCII
Неправильный выбор режима — наиболее частая причина ситуации «загрузка прошла, но файл повреждён»:
FTP_BINARYпередаёт байты точно как есть. Используйте его для всего по умолчанию — изображений, архивов, PDF, исполняемых файлов и даже текста на практике.FTP_ASCIIперезаписывает окончания строк (\n↔\r\n) в соответствии с целевой платформой. Имеет смысл только для обычного текста и бесшумно уничтожит любой бинарный файл. При сомнениях оставайтесь наFTP_BINARY.
Полная загрузка файла
Всегда проверяйте возвращаемые значения каждого FTP-вызова, а не считайте, что шаг выполнился успешно:
<?php
// 1. Open a connection (false on failure)
$ftp = ftp_connect('ftp.example.com');
if ($ftp === false) {
exit("Could not connect to FTP server.\n");
}
// 2. Authenticate
if (!ftp_login($ftp, 'username', 'password')) {
ftp_close($ftp);
exit("FTP login failed.\n");
}
// 3. Behind a firewall/NAT? Passive mode is almost always required.
ftp_pasv($ftp, true);
// 4. Upload: local file -> remote path, binary mode
$ok = ftp_put($ftp, '/public_html/index.html', './build/index.html', FTP_BINARY);
echo $ok
? "Upload succeeded.\n"
: "Upload failed.\n";
// 5. Always close
ftp_close($ftp);Обратите внимание на порядок аргументов: сначала удалённый путь назначения, затем локальный источник — обратный тому, чего многие ожидают. Если перепутать их местами, PHP попытается прочитать несуществующий локальный файл и вызов завершится с ошибкой.
Обработка ошибок
ftp_put() возвращает false и выдаёт PHP-предупреждение при сбое. Преобразуйте это в понятный и информативный результат, вместо того чтобы допускать утечку случайного предупреждения в вывод:
<?php
$remote = '/public_html/index.html';
$local = './build/index.html';
// Catch the "no such local file" case before touching the network.
if (!is_readable($local)) {
exit("Local file '$local' is missing or unreadable.\n");
}
if (!ftp_put($ftp, $remote, $local, FTP_BINARY)) {
// Common causes: wrong remote directory, no write permission,
// disk quota exceeded, or passive mode not enabled.
echo "Failed to upload '$local' to '$remote'.\n";
} else {
echo "Uploaded '$local' to '$remote'.\n";
}
ftp_close($ftp);Распространённые причины сбоев
- Неправильный порядок аргументов — удалённый и локальный пути перепутаны местами.
- Пассивный режим не установлен — большинству серверов за NAT требуется
ftp_pasv($ftp, true)после входа. - Отсутствует удалённая директория —
ftp_put()не создаёт папки; используйте сначалаftp_mkdir(). - Нет прав на запись или превышена квота на стороне сервера.
- Неправильный режим передачи, повреждающий бинарный файл (используйте
FTP_BINARY).
Загрузка из открытого потока
Если ваши данные уже представлены в виде открытого дескриптора файла (или поступают из обёртки потока, а не из пути на диске), используйте вместо этого ftp_fput() — она принимает ресурс потока вместо имени локального файла.
Заключение
ftp_put() загружает локальный файл на удалённый FTP-сервер. Запомните три вещи, которые вызывают большинство проблем: передавайте удалённый путь первым, оставайтесь на FTP_BINARY, если нет особой причины использовать ASCII, и проверяйте каждое возвращаемое значение. Для неблокирующих передач, которые не останавливают скрипт, смотрите ftp_nb_put().