PHP - ftp_put + Копировать всю структуру папок - PullRequest
3 голосов
/ 08 января 2012

Я пытаюсь создать сценарий FTP, который будет копировать структуру локальной папки до точки FTP.В основном, чтобы обновить веб-сайт.

Я тестировал следующий код (изменил пользователя / пароль / домен), но соединение не прерывается и, кажется, работает.

   $server = 'ftp.domainname.co';
   $ftp_user_name = 'user';
   $ftp_user_pass = 'pass';
   $dest = '.';
   $source = '.';
   $mode = 'FTP_ASCII';


   $connection = ftp_connect($server);

   $login = ftp_login($connection, $ftp_user_name, $ftp_user_pass);

   if (!$connection || !$login) { die('Connection attempt failed!'); }

   $upload = ftp_put($connection, $dest, $source, $mode);

   if (!$upload) { echo 'FTP upload failed!'; }

   ftp_close($connection); 

Я уверен, что точка, которая ломает, является строкой ftp_put.Мои вопросы:

  1. Может ли ftp_put загрузить всю структуру каталогов с файлами и т. Д., Или это просто для загрузки по одному файлу за раз?Есть ли другая команда, которую я должен использовать?

  2. Я думаю, что у меня что-то не так с этими переменными:

        $dest = '.';
        $source = '.';
        $mode = 'FTP_ASCII';
    

Я считаю, что режимявляется правильным.

$ dest - это просто корень ftp-сервера, являющийся ftp.domainname.co - я должен указать имя ftp-сервера или что здесь будет.

$ source - thisявляется текущим локальным путем - я также попробовал полный путь C: \ etc.

Я получаю эту ошибку: Предупреждение: ftp_put () ожидает, что параметр 4 будет длинным

любая помощьбыло бы здорово.

thx

Ответы [ 3 ]

12 голосов
/ 08 января 2012

Не работает, так как ожидает файл, а не каталог. Руководство по PHP для ftp_put содержит несколько примеров кода для рекурсивных загрузок файлов, отправленных комментаторами.

Вот один из них (обратите внимание, что для него требуется полный путь):

function ftp_putAll($conn_id, $src_dir, $dst_dir) {
    $d = dir($src_dir);
    while($file = $d->read()) { // do this for each file in the directory
        if ($file != "." && $file != "..") { // to prevent an infinite loop
            if (is_dir($src_dir."/".$file)) { // do the following if it is a directory
                if (!@ftp_chdir($conn_id, $dst_dir."/".$file)) {
                    ftp_mkdir($conn_id, $dst_dir."/".$file); // create directories that do not yet exist
                }
                ftp_putAll($conn_id, $src_dir."/".$file, $dst_dir."/".$file); // recursive part
            } else {
                $upload = ftp_put($conn_id, $dst_dir."/".$file, $src_dir."/".$file, FTP_BINARY); // put the files
            }
        }
    }
    $d->close();
}
1 голос
/ 09 декабря 2014
Warning: ftp_put() expects parameter 4 to be long

Ну, мне кажется, это совершенно очевидно: параметр 4 должен быть «длинным» (или: число). В этом случае это также может быть CONSTANT, который представляет это число, например ftp_put(x, y, z, FTP_ASCII). Не с кавычками ('), как вы это сделали: ftp_put(x, y, z, 'FTP_ASCII')

0 голосов
/ 26 июня 2019

Для тех, кто все еще ищет ответ: я сделал суть, чтобы сделать это: FTPRecursiveFolderUpload.php , который будет обновлен, но вот основной код:

<?php
error_reporting(E_ERROR | E_PARSE);
//Define vars
$ftp_server = getenv('server'); // As ftp.server.com
$ftp_user_name = getenv('user'); // As user
$ftp_password = getenv('password'); //As password
$remoteDir = getenv('remoteDir'); // As /home/user/ftp/ WITH the last slash!!
$dir = getenv('dir'); // As folder/download WITHOUT the last slash!!
function make_directory($ftp_stream, $dir){ //Create FTP directory if not exists
    // if directory already exists or can be immediately created return true
    if (ftp_chdir ($ftp_stream, $dir) || @ftp_mkdir($ftp_stream, $dir)) return true;
    // otherwise recursively try to make the directory
    if (!make_directory($ftp_stream, dirname($dir))) return false;
    // final step to create the directory
    return ftp_mkdir($ftp_stream, $dir);
}
if (boolval(getenv('ssl')) == true){ // Is it and SSL Connection
    $conn_id = ftp_ssl_connect($ftp_server, intval(getenv('port'))); // Create FTP Secure Connection
}else{
    $conn_id = ftp_connect($ftp_server, intval((getenv('port')? getenv('port') : 21))); // Create FTP  Connection
}
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_password); //Login in with credentials
if ((!$conn_id) || (!$login_result)) { // If login fails
    echo "FTP Connection failed to server $ftp_server for user $ftp_user_name <br>\r\n";
    exit;
} else {
    echo "Connected to Server $ftp_server, for user $ftp_user_name <br>\n";
}
ftp_pasv($conn_id, true); // Set Passive mode
$recursiveFileResearch = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); // Get all files in folder and subfolder in the selected directory
$files = array();
foreach ($recursiveFileResearch as $file) {
    if ($file->isDir()){
        continue;
    }
    $files[] = str_replace($dir . "/", "", str_replace('\\', '/', $file->getPathname())); // Store the file without backslashes (Windows..) and without the root directory
}
if (count($files) > 0) {
    foreach ($files as $file) {
        make_directory($conn_id, $remoteDir . dirname($file)); // Create directory if not exists
        ftp_chdir ($conn_id, $remoteDir . dirname($file)); // Go to that FTP directory
        echo "Current directory : " . ftp_pwd($conn_id) . " for file : " . basename($file)
            . " that could be found locally : " . $dir . "/" . $file . "<br>\n"; // Some logs to chekc the process
        ftp_put($conn_id, basename($file), $dir . "/"  . $file, FTP_BINARY); //Upload the file to current FTP directory
        echo "Uploaded " . basename($file) . "<br>\n"; // Some logs to chekc the process
    }
} else {
    echo "Didn't found any folder/files to send in directory : " . $dir . "<br>\n";
}
ftp_close($conn_id); // Close FTP Connection
echo "Finished <br>\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...