PHP_FTP и копирование файлов.

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 3 июля 2014 в 16:02
Уважаемые Гуру — выручайте.
Не получается решить задачу.
Задача заключается в том, чтобы используя функцию PHP_FTP создать КОПИЮ файла (с другим именем естественно) на сервере не выгружая его за пределы этого сервера.
Команды copy в PHP_FTP нет. Есть удаление и переименование.
Я подозреваю что нужно использовать функцию FTP_PUT передав в качестве параметров дескриптор файла который нужно скопировать и имя файла в который нужно скопировать исходный файл.
  1.  
  2. $file_in = fopen($_SERVER["DOCUMENT_ROOT"] . $file['file_original'], "b");
  3. $file_out = $mypatch_options['path'] . $file['file_original'] . '.original';
  4. $result = @ftp_put($connection, $file_out, $file_in, FTP_BINARY);
  5.  
Но эта сволочь ругается:


Warning: fopen(_тут путь к файлу_): failed to open stream: No such file or directory in _тут путь к файлу где это выполняется_

Опять таки понимаю что скорее всего косяк в том что тестирую я это все на локальном компе под OpenServ и пути к искомому файлу не с теми слешами.
Если дело в этом — то подскажите как сделать чтобы функция понимала что счас она в винде и слешы нужно использовать прямые, а если скрипт запущен в юниксе — то обратные.
Или может есть более правильные пути решения задачи.
Надо всего-то взять файл и скопировать его рядом с другим именем… Блин проще задачи не придумаешь — а вот уже сутки мучаюсь.
Да и еще — почему нужно именно использовать FTP — так как именно через права доступа пользователя ftp можно получить что-то менять на сервере.
#2 3 июля 2014 в 16:26
Скорпион, тороплюсь, поэтому быстренько.
Вы тут напутали всё что можно. Судя по всему скрипт выполняется на локальном сервере. И вы, получается пытаетесь загрузить на сторонний сервер по фтп.
Ну, во-первых, fopen() открывает файл на запись или чтение и возвращает дескриптор этого файла для дальнейшей работы с ним.
Функция ftp_put() позволяет загрузить локальный файл по фтп. При этом третий параметр должень быть путь к локальному файлу. А у вас туда передается дескриптор $file_in. Описание функции.

Warning: fopen(_тут путь к файлу_): failed to open stream: No such file or directory in _тут путь к файлу где это выполняется

Это указывает, что неправильно указан путь к файлу для открытия функцией fopen(). Проверьте ещё раз, что у вас там в переменных. Сомневаюсь, что тут дело в слешах. Не уверен в опенсервере(не пользуюсь), для денвера слеши — не проблема, линуксовые слеши работают прекрасно.
В вашем случае, если я правильно понял задачу — создать копию файла в той же директории, я бы воспользовался copy()
#3 3 июля 2014 в 16:34
Марат,

В вашем случае, если я правильно понял задачу — создать копию файла в той же директории, я бы воспользовался copy()

Марат
Не получится… для этого нужно дать разрешение вебсерверу на запись, что в нашем случае категорически запрещено — ибо это дырка в безопасности.
#4 3 июля 2014 в 16:35

При этом третий параметр должень быть путь к локальному файлу. А у вас туда передается дескриптор $file_in

Марат
Разве в третий? А не во второй?
#5 3 июля 2014 в 16:40
хм… действительно перепутал… и функцию не правильно указал, просто мозг уже кипит и я что только не пробовал...
вот команда от которой я хочу добиться результата:
  1.  
  2. $result = @ftp_fput($connection, $file_in, $file_out, FTP_BINARY);
  3.  
То есть я хочу сначала открыть дескриптор нужного файла и потом запихнуть его через этот дескриптор в новый файл.
Неправильно рассуждаю?
но всеравно… первый затык в открытие дескриптора… и мне кажется что проблема в слешах…
#6 3 июля 2014 в 17:26
  1. $connection = @ftp_connect($ftp_host, $ftp_port);
  2. if (!$connection){ return 'FTP_CONNECT_FAILED'; }
  3.  
  4. $session = @ftp_login($connection, $ftp_user, $ftp_pass);
  5. if (!$session){ return 'FTP_AUTH_FAILED'; }
  6.  
  7. $remote_path = 'путь_от_корня_ftp/до_нужной_папки/новое_имя_файла.расширение';
  8. $from_file_path = '/полный/путь/до/исходного_файла.расширение';
  9.  
  10. $result = @ftp_put($connection, $remote_path, $from_file_path, FTP_BINARY);
  11. if (!$result) { return 'FTP_UPLOAD_FAILED'; }
  12.  
  13. // при желании устанавливаем права доступа на файл, например 666
  14. @ftp_chmod($connection, 0666, $remote_path);
  15.  
  16. ftp_close($connection);
#7 3 июля 2014 в 19:03
Fuze, Уважаемый… на основании это куска кода из install_ftp.php двойки я и пытаюсь решить задачу.......
невыходит....
Может подскажите как видеть на что ругается @ftp_pub отправля в $resultat FALSE?
#8 3 июля 2014 в 19:04
Марат, вот видите — всетаки третий параметр это не КУДА копируем — а ЧТО копируем… значит всетаки я прав был в первом посте.
#9 3 июля 2014 в 19:29
Вы меня не поняли. В вашем первом посте:
  1. $file_in = fopen($_SERVER["DOCUMENT_ROOT"] . $file['file_original'], "b");
В перем. $file_in у вас — дескриптор открытого файла и вы его передаете в ftp_put() третьим параметром:
  1. $result = @ftp_put($connection, $file_out, $file_in, FTP_BINARY);
Что недопустимо. Поскольку в доках, ссылку на которые я дал, указано, что третьим параметром ftp_put() получает Путь к локальному файлу в виде строки.
Другое дело, ваш 5-й пост
  1. $result = @ftp_fput($connection, $file_in, $file_out, FTP_BINARY);
Вот на что я вам указывал. И не более того.
Я по прежнему придерживаюсь, что лучше использовать copy(). Запись в папку нужно разрешить пользователю, под которым работает пхп. Есть и другие папки, где это разрешено. Например, /cashe или /upload Дело, конечно же, ваше. Для фтп доступа, где-то на сервере надо хранить логин и пасс, что тоже не совсем безопасно.
Fuze вам дал вариант с фтп. Пользуйтесь.
#10 3 июля 2014 в 19:31
В PHP есть предопределённая константа DIRECTORY_SEPARATOR, содержащая разделитель пути. Для Windows это «\», для Linux и остальных — «/».
#11 3 июля 2014 в 19:53
мля… ну вот как это называется? Законы Мерфи в действии....?
Сейчас взял, стер все.., все закомментированные тестовые строки и заново, с чистого листа, перенабрал код......
и все блин заработало как надо.
млин....
ребят — спасибо за помощь — видно всетаки надо периодически отдыхать и иногда удалять "тестовые строки" и с чистого листа писать код.
#12 3 июля 2014 в 19:56
Итог функции:
  1.  
  2. private function CreateFileOriginal($files) {
  3. $mypatch_options = cmsController::loadOptions('mypatch');
  4.  
  5. $connection = @ftp_connect($mypatch_options['host'], $mypatch_options['port']);
  6.  
  7. if (!$connection){ cmsUser::addSessionMessage(LANG_MYPATCH_CP_FTP_AUTH_FAILED, 'error'); return false; }
  8. $session = @ftp_login($connection, $mypatch_options['user'], $mypatch_options['pass']);
  9.  
  10. if (!$session){ cmsUser::addSessionMessage(LANG_MYPATCH_CP_FTP_AUTH_FAILED, 'error'); return false; }
  11. if ($mypatch_options['is_pasv']) { ftp_pasv($connection, true); }
  12.  
  13. foreach ($files as $file){
  14. if ($file['state_patch'] == 1 && $file['state_file'] == 1){
  15.  
  16. $file_out = $mypatch_options ['path'] . $file['file_original'] . ".original";
  17. $file_in = $_SERVER['DOCUMENT_ROOT'] . $file['file_original'];
  18. $result = @ftp_put($connection, $file_out, $file_in, FTP_BINARY);
  19. if (!$result) { $error[] = $file['id']; }
  20.  
  21. }
  22. }
  23.  
  24. ftp_close($connection);
  25. $mypatch_error['file_put'] = $error;
  26. return $mypatch_error;
  27.  
  28. }
  29.  
#13 4 июля 2014 в 08:18
Ну раз дополнить никому нечего… еще раз всем спасибо dance… закрываю.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.