ftp_fput()
Функция ftp_fput() — встроенная функция PHP для загрузки файла на FTP-сервер из открытого дескриптора файла.
Что такое ftp_fput()?
Функция ftp_fput() — это встроенная функция PHP, которая загружает файл на FTP-сервер. Функция принимает пять параметров:
ftp_stream: идентификатор соединения, возвращаемый функциейftp_connect().remote_file: имя удалённого файла, в который должна быть загружена информация.local_file: дескриптор ресурса файла, открытый с помощьюfopen(), указывающий на локальный файл для загрузки.mode(необязательный): режим передачи (FTP_ASCIIилиFTP_BINARY). По умолчанию —FTP_ASCII.startpos(необязательный): начальная позиция в удалённом файле для загрузки. По умолчанию —0.
Функция возвращает boolean-значение. Если файл успешно загружен, функция возвращает true. В противном случае она возвращает false.
Когда использовать ftp_fput() вместо ftp_put()
ftp_put() принимает локальный путь к файлу в виде string и самостоятельно открывает файл. ftp_fput() вместо этого принимает уже открытый дескриптор файла. Используйте ftp_fput() в следующих случаях:
- Данные для загрузки не являются обычным файлом на диске — например, это временный поток, созданный с помощью
php://temp, или вывод другого ресурса, который у вас уже открыт. - Необходим точный контроль над позицией чтения (в сочетании с параметром
startposможно возобновить прерванную загрузку). - Дескриптор уже был открыт по другой причине, и вы хотите избежать повторного открытия того же файла.
Если вы просто хотите загрузить существующий файл по имени, ftp_put() будет проще. Для неблокирующей (асинхронной) загрузки смотрите ftp_nb_fput().
Синтаксис ftp_fput()
Синтаксис функции ftp_fput() выглядит следующим образом:
Синтаксис ftp_fput()
bool ftp_fput ( resource $ftp_stream , string $remote_file , resource $local_file [, int $mode = FTP_ASCII [, int $startpos = 0 ]] )Использование ftp_fput()
Чтобы использовать функцию ftp_fput(), сначала необходимо установить соединение с FTP-сервером с помощью функции ftp_connect(). Вот пример:
Использование ftp_fput() в PHP
<?php
// Set up an FTP connection
$conn = ftp_connect('ftp.example.com');
if (!$conn) {
die("Could not connect to FTP server.");
}
// Login with your FTP credentials
if (!ftp_login($conn, 'username', 'password')) {
die("Login failed.");
}
// Open the local file
$local_file = fopen('/local/directory/local_file.txt', 'r');
if (!$local_file) {
die("Could not open local file.");
}
// Upload the file to the remote FTP server
if (ftp_fput($conn, 'remote_file.txt', $local_file, FTP_ASCII)) {
echo "File uploaded successfully.\n";
} else {
echo "Failed to upload the file.\n";
}
// Close the file handle and FTP connection
fclose($local_file);
ftp_close($conn);В этом примере мы устанавливаем соединение с FTP-сервером с помощью функции ftp_connect() и проверяем, что оно установлено успешно. Затем выполняем вход с использованием учётных данных FTP через ftp_login() и проверяем наличие ошибок. Далее открываем локальный файл с помощью fopen(), чтобы получить необходимый дескриптор файла. Наконец, загружаем файл на удалённый FTP-сервер с помощью ftp_fput() и закрываем как дескриптор файла, так и FTP-соединение с помощью ftp_close().
Выбор режима передачи: FTP_ASCII и FTP_BINARY
Параметр mode управляет способом передачи байтов и важнее, чем кажется:
FTP_BINARYпередаёт файл побайтово, без изменений. Используйте его для изображений, архивов, исполняемых файлов, PDF-файлов — всего, что не является обычным текстом. Это безопасный вариант по умолчанию почти для всего.FTP_ASCIIпреобразует окончания строк между локальной и удалённой платформами (например,\n↔\r\n). Он подходит только для текстовых файлов, а применение его к бинарным данным приведёт к незаметному повреждению файла.
При открытии локального дескриптора согласуйте режим fopen() с режимом передачи: используйте 'rb' (чтение в бинарном режиме) вместе с FTP_BINARY, чтобы PHP не изменял байты при чтении:
<?php
$local_file = fopen('/local/directory/photo.jpg', 'rb');
ftp_fput($conn, 'photo.jpg', $local_file, FTP_BINARY);
fclose($local_file);Обработка ошибок в ftp_fput()
При использовании функции ftp_fput() важно правильно обрабатывать ошибки. Если функция возвращает false, это означает, что файл по какой-то причине не удалось загрузить. Вот пример обработки ошибок:
Обработка ошибок в ftp_fput()
<?php
// Assuming $conn is already established via ftp_connect() and ftp_login()
$local_file = fopen('/local/directory/local_file.txt', 'rb');
if ($local_file === false) {
echo "Could not open the local file.\n";
} elseif (ftp_fput($conn, 'remote_file.txt', $local_file, FTP_BINARY)) {
echo "File uploaded successfully.\n";
fclose($local_file);
} else {
echo "Failed to upload the file.\n";
fclose($local_file);
}Обратите внимание на порядок проверок: сначала убеждаемся, что fopen() вернул допустимый дескриптор, и только потом вызываем ftp_fput(). Вызов fclose() с дескриптором false (что происходит, если исходный пример пропускает проверку открытия) генерирует предупреждение, поэтому дескриптор закрывается только в тех ветвях, где он действительно был открыт. Это предотвращает вывод сообщения об успехе в случае, когда загрузка не произошла.
Распространённые ошибки
- Передача пути вместо дескриптора.
ftp_fput()ожидает ресурс, возвращаемый функциейfopen(), а не string с именем файла. Если у вас есть путь, используйте вместо этогоftp_put(). - Неверный режим передачи. Загрузка бинарного файла с
FTP_ASCIIповреждает его. При сомнениях используйтеFTP_BINARY. - Незакрытый дескриптор. Всегда вызывайте
fclose()после завершения передачи, чтобы освободить ресурс. - Пассивный режим. За брандмауэром многие серверы требуют пассивного режима. Если загрузка зависает, вызовите
ftp_pasv($conn, true)после входа в систему.
Заключение
Функция ftp_fput() загружает файл на FTP-сервер из открытого дескриптора файла, что делает её правильным выбором, когда данные уже находятся в потоке, а не по фиксированному пути на диске. Используйте правильный режим передачи, проверяйте возвращаемые значения как fopen(), так и ftp_fput(), закрывайте дескрипторы — и функция будет надёжно служить в ваших PHP-проектах.