Как загрузить файл по sftp в php?
никак не получается загрузить файл на удаленную машину с использованием библиотеки phpseclib
вот код который я использую:
<?php require_once '../vendor/autoload.php'; // Путь к autoloader'у библиотеки phpseclib use phpseclibNetSFTP; // Используем класс SFTP $remoteHost = '192.168.146.129'; $remoteUsername = 'PC'; $remotePassword = 'root'; $remoteUploadDirectory = 'C:\Users\PC\Desktop\'; // Путь к директории на удаленном сервере, куда будем загружать файл if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['uploadedFile'])) { $uploadedFile = $_FILES['uploadedFile']; if ($uploadedFile['error'] === UPLOAD_ERR_OK) { $remoteUploadPath = $remoteUploadDirectory . basename($uploadedFile['name']); $sftp = new SFTP($remoteHost); if (!$sftp->login($remoteUsername, $remotePassword)) { die('SFTP Login Failed'); } if (!$sftp->is_dir($remoteUploadDirectory)) { if (!$sftp->mkdir($remoteUploadDirectory, -1, true)) { die('Failed to create remote directory: ' . $sftp->getLastSFTPError()); } } if ($sftp->put($remoteUploadPath, $uploadedFile['tmp_name'], SFTP::SOURCE_LOCAL_FILE)) { echo "Файл успешно загружен на удаленный сервер."; } else { echo "Ошибка при загрузке файла на удаленный сервер."; } } else { echo "Ошибка: " . $uploadedFile['error']; } } ?> <!DOCTYPE html> <html> <head> <title>Загрузка файла на удаленный сервер</title> </head> <body> <h2>Загрузите файл на удаленный сервер:</h2> <form method="POST" enctype="multipart/form-data"> <input type="file" name="uploadedFile"> <button type="submit">Загрузить</button> </form> </body> </html> |
<?php require_once '../vendor/autoload.php'; // Путь к autoloader'у библиотеки phpseclib use phpseclibNetSFTP; // Используем класс SFTP $remoteHost = '192.168.146.129'; $remoteUsername = 'PC'; $remotePassword = 'root'; $remoteUploadDirectory = 'C:\Users\PC\Desktop\'; // Путь к директории на удаленном сервере, куда будем загружать файл if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['uploadedFile'])) { $uploadedFile = $_FILES['uploadedFile']; if ($uploadedFile['error'] === UPLOAD_ERR_OK) { $remoteUploadPath = $remoteUploadDirectory . basename($uploadedFile['name']); $sftp = new SFTP($remoteHost); if (!$sftp->login($remoteUsername, $remotePassword)) { die('SFTP Login Failed'); } if (!$sftp->is_dir($remoteUploadDirectory)) { if (!$sftp->mkdir($remoteUploadDirectory, -1, true)) { die('Failed to create remote directory: ' . $sftp->getLastSFTPError()); } } if ($sftp->put($remoteUploadPath, $uploadedFile['tmp_name'], SFTP::SOURCE_LOCAL_FILE)) { echo "Файл успешно загружен на удаленный сервер."; } else { echo "Ошибка при загрузке файла на удаленный сервер."; } } else { echo "Ошибка: " . $uploadedFile['error']; } } ?> <!DOCTYPE html> <html> <head> <title>Загрузка файла на удаленный сервер</title> </head> <body> <h2>Загрузите файл на удаленный сервер:</h2> <form method="POST" enctype="multipart/form-data"> <input type="file" name="uploadedFile"> <button type="submit">Загрузить</button> </form> </body> </html>
с загрузкой файлов на kali linux не было никаких проблем, а тут скрипт просто не может найти директорию
проверял через командную строку, все работает, написал скрипт на питоне, тоже все хорошо, а с php проблемы какие-то
вот код на питоне:
import paramiko def create_sftp_client(host, port, username, password): transport = paramiko.Transport((host, port)) transport.connect(username=username, password=password) sftp_client = paramiko.SFTPClient.from_transport(transport) return sftp_client def upload_file_to_server(sftp_client, local_file, remote_file): sftp_client.put(local_file, remote_file) def main(): sftp_client = create_sftp_client("192.168.146.129", 22, "PC", "root") upload_file_to_server(sftp_client, "C:\Users\PC\Desktop\test.txt", "C:\Users\PC\Desktop\test.txt") if __name__ == "__main__": main() |
import paramiko def create_sftp_client(host, port, username, password): transport = paramiko.Transport((host, port)) transport.connect(username=username, password=password) sftp_client = paramiko.SFTPClient.from_transport(transport) return sftp_client def upload_file_to_server(sftp_client, local_file, remote_file): sftp_client.put(local_file, remote_file) def main(): sftp_client = create_sftp_client("192.168.146.129", 22, "PC", "root") upload_file_to_server(sftp_client, "C:\Users\PC\Desktop\test.txt", "C:\Users\PC\Desktop\test.txt") if __name__ == "__main__": main()
подскажите пожалуйста что я не так делаю
Дополнительно:
На каком шаге и какая ошибка?
Ошибка при загрузке файла на удаленный сервер. ?
не хватает информации что возвращает при ошибке $sftp->getLastSFTPError()
Во-первых, в заголовке вопроса надо описывать возникшую перед вами проблему, а не спрашивать про то, что вам и так уже известно.
Судя по коду, и по тому что "на kali linux не было никаких проблем", что бы это не значило, ответ на вопрос "Как загрузить файл по sftp в php?" вам и так уже известен. Что делает вопрос изначально бессмысленным.
Во-вторых, если код по каким-то причинам не работает, надо не изображать трехмесячного ребенка, который агукает и пускает пузыри, сообщая родителям о своих проблемах. А четко, детально и в максимальных подробностях описывать полученный результат.
"никак не получается" и "просто не может найти директорию" - это то самое агуканье.
Какую директорию? На каком компьютере? Кто не может? В чем выражается это "не может"? Какую ошибку выводит?
В-третьих, если вас интересует "Как загрузить файл по sftp в php", то именно это и должно быть в коде.
Не "как вывести форму для загрузки локальных файлов"
Не "как обработать в РНР форму с зарузкой файлов".
А сделать аналог скрипта на Питоне, который делает только что, что заявлено в вопросе, и ничего больше.
И уже с ним разбираться
P.S. Найдите вашему PHP какую-нибудь симпатичную директорию.
SFTP попросту не может найти указанный путь на удаленном сервере, хотя скрипт на python с точно такой же логикой работает без проблем, файл загружается что на рабочий стол, что в другие папки
upload_file_to_server(sftp_client, "C:\Users\PC\Desktop\test.txt", "C:\Users\PC\Desktop\test.txt")upload_file_to_server(sftp_client, "C:\Users\PC\Desktop\test.txt", "C:\Users\PC\Desktop\test.txt")
у него два одинаковых юзера на разных компах, или он с тем же самым компьютером соединяется.
ошибка заключалась в том, что нужно было указывать путь следующим образом:
$remoteUploadDirectory = '/C:/Users/PC/Desktop/tmp/'; - правильный путь
$remoteUploadDirectory = 'C:/Users/PC/Desktop/tmp/'; - не правильный путь
увидел это при повторной попытке загрузить файл через командную строку
Ответы:
Мне нетрудно скопировать пример из документации
<?php $connection = ssh2_connect('shell.example.com', 22); ssh2_auth_password($connection, 'username', 'password'); ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644); |
<?php $connection = ssh2_connect('shell.example.com', 22); ssh2_auth_password($connection, 'username', 'password'); ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
И получить на 100% корректный и на 100% бесполезный ответ.
Важна ведь не полезность ответа, а чтобы он понравился модераторам этого богоспасаемого ресурса.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для загрузки файла по протоколу SFTP в PHP, вы можете использовать библиотеку phpseclib. Ниже приведен пример кода, который показывает, как загрузить файл на удаленный сервер через SFTP.
login($username, $password)) { exit('Login Failed'); } $localFile = 'localfile.txt'; $remoteFile = 'remotefile.txt'; if (!$sftp->put($remoteFile, $localFile, NET_SFTP_LOCAL_FILE)) { exit('Upload Failed'); } else { echo 'File Uploaded Successfully'; }
Прежде всего, убедитесь, что у вас установлена библиотека phpseclib. Затем включите файл Net/SFTP.php и укажите хост, имя пользователя и пароль для подключения к серверу SFTP. Создайте новый экземпляр класса Net_SFTP и выполните вход на сервер. Затем укажите путь к локальному файлу и путь к удаленному файлу на сервере. Вызовите метод put(), чтобы загрузить файл на удаленный сервер.
Этот код поможет вам загрузить файл по SFTP в PHP. Не забудьте заменить значения переменных хост, имя пользователя, пароль, локального файла и удаленного файла на свои собственные.