Как загрузить файл по sftp в php?

Ссылка скопирована
1 ответ

никак не получается загрузить файл на удаленную машину с использованием библиотеки 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()

  • Чтобы загрузить файл по sftp в php, надо научиться задавать вопросы.

    Во-первых, в заголовке вопроса надо описывать возникшую перед вами проблему, а не спрашивать про то, что вам и так уже известно.
    Судя по коду, и по тому что "на kali linux не было никаких проблем", что бы это не значило, ответ на вопрос "Как загрузить файл по sftp в php?" вам и так уже известен. Что делает вопрос изначально бессмысленным.

    Во-вторых, если код по каким-то причинам не работает, надо не изображать трехмесячного ребенка, который агукает и пускает пузыри, сообщая родителям о своих проблемах. А четко, детально и в максимальных подробностях описывать полученный результат.
    "никак не получается" и "просто не может найти директорию" - это то самое агуканье.
    Какую директорию? На каком компьютере? Кто не может? В чем выражается это "не может"? Какую ошибку выводит?

    В-третьих, если вас интересует "Как загрузить файл по sftp в php", то именно это и должно быть в коде.
    Не "как вывести форму для загрузки локальных файлов"
    Не "как обработать в РНР форму с зарузкой файлов".
    А сделать аналог скрипта на Питоне, который делает только что, что заявлено в вопросе, и ничего больше.
    И уже с ним разбираться

  • hydra_cc, ага, ага, "у меня в ухе свистит на частототах 576 и 460 Герц продолжительностью 2 секунды с паузами 0.53 секунды. подскажите, в каком ухе у меня свистит?"

    P.S. Найдите вашему PHP какую-нибудь симпатичную директорию.

  • Проблема в пути. Вряд ли политики винды дают грузить файл на рабочий стол
  • Дмитрий, проверял другой путь, тоже самое NET_SFTP_STATUS_NO_SUCH_FILE
    SFTP попросту не может найти указанный путь на удаленном сервере, хотя скрипт на python с точно такой же логикой работает без проблем, файл загружается что на рабочий стол, что в другие папки
  • nokimaro, NET_SFTP_STATUS_NO_SUCH_FILE
  • Мне вот другое интересно

    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/'; - не правильный путь

    увидел это при повторной попытке загрузить файл через командную строку

    Как загрузить файл по sftp в php?

    Ответы:

    Мне нетрудно скопировать пример из документации

    <?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% бесполезный ответ.
    Важна ведь не полезность ответа, а чтобы он понравился модераторам этого богоспасаемого ресурса.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Юрий Linux Ответ

    Для загрузки файла по протоколу 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';
    }

    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. Не забудьте заменить значения переменных хост, имя пользователя, пароль, локального файла и удаленного файла на свои собственные.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно