Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: FTP. Закачка В и ИЗ, без манагера
 
 автор: Anwor   (08.07.2006 в 23:25)   письмо автору
 
 

Всем доброго времени суток.

Прошу мне помочь, проблема отлагательств не терпит, в общем, нужно мне организовать инструмент взаимодействия с ФТП. К выкладываемым файлам имеют доступ все, т.е. гемора с ЮНИХовыми правами доступа не нужно совсем...
Поскольку архитектура данного инструмента кардинально отличается от ФТП-Менеджера из downloads, то пожалуйста, не делайте на него ссылок.

Итак, есть 3 основных скрипта:

docs_add.php

<?php
session_start
();
function 
split_folder($var) {
...........
}

if (isset(
$_POST['upload'])) {
    
$error="";
    if (empty(
$file_path)) $error.="<LI>Не выбран путь к файлу на жестком диске \n";
    if (empty(
$_POST['file_name'])) $error.="<LI>Не указано имя документа \n";
    if (empty(
$_POST['file_folder'])) $error.="<LI>Не выбрано дело \n";
    if (empty(
$_POST['file_note'])) $error.="<LI>Нет описания документа \n";
    if (!empty(
$error)) {
        print 
"<font color='red'>Ошибка запроса! </font><font color='red'><br>
        
$error</font>";
    } else {

    
//Если всё ок:
        //создать директорию, соответствующую текущему делу делу:
        
$created_dir=$_POST['file_folder'];
        
//разбить исходное имя файла на составляющие:
        
$path_parts=pathinfo($file_path);
        
//вытащить расширение:
        
$ext=$path_parts["extension"];
        
//присвоить будущему файлу на сервере новое имя со старым расширением:
        
$file=$_POST['file_name'].".$ext";
        
//составить удаленный путь к файлу на сервере:
        
$path="/documents/$created_dir/$file";
        
///////организовать МуСКвЛ оформление:
        //запросы запросы запросы...........
                                           
$queriez[]=$query1;
        
$queriez[]=$query2;
        
$queriez[]=$query3;
        
$queriez[]=$query4;
        for (
$i=1$i<=$_SESSION['numroles']; ++$i) {
        
/////////////
        //передать сессии следующие переменные:
        //набор запросов к базе;
        
$_SESSION['queries']=$queriez;
        
//расширение файла;
        
$_SESSION['ext']=$ext;
        
//создаваемая директория;
        
$_SESSION['created_dir']=$created_dir;
        
//имя файла (новое);
        
$_SESSION['name']=$_POST['file_name'];
        
//удаленный путь к файлу на сервере;
        
$_SESSION['file_remote']=$path;
        
//примечание;
        
$_SESSION['note']=$_POST['file_note'];
        
//путь к файлу на жестком.
        
$_SESSION['file']=$file_path;
        
//редирект на подтверждение.
        
print "<HTML><HEAD>\n";
          print 
"<META HTTP-EQUIV='Refresh' CONTENT='0; URL=docs_add_confirm.php'>\n";
        print 
"</HEAD></HTML>\n";
    }
}


Далее переходим к странице подтверждения:

docs_add_confirm.php

<?php
session_start
();
echo (
" Файл:<strong>".$_SESSION['name']."</strong></p>
<p>Описание: <strong>"
.$_SESSION['note']."</strong></p>
<p>Расширение файла: "
.$_SESSION['ext']."</p>
"
);
if ((
$_SESSION['ext']=='jpg') || ($_SESSION['ext']=='gif')) {
    echo (
"<strong>Файл является изображением: </strong><br>
    <br>
    <img src='"
.$_SESSION['file']."'><br><br>".$_SESSION['file']);
} else if ((
$_SESSION['ext']=='txt') || ($_SESSION['ext']=='htm') || ($_SESSION['ext']=='html')) {
    echo (
"<strong>Файл является текстом: </strong><br>
    <br>"
);
    
$file_array=file($_SESSION['file']);
    if (
count($file_array)<3000) {
        foreach (
$file_array as $value) {
            
$value=htmlspecialchars($value);
            
$value=trim($value);
            echo 
"$value<br>";
        }
        echo 
"<br>
        "
;
    } else {
        echo 
"Размер файла слишком велик для отображения в HTML.<br>
        <br>
        "
;
    }
} else {
    echo 
"Загружаемый файл не может быть интерпретирован в HTML.<br>
    <br>
    "
;
}
?>

Этот код уже в чем-то ошибочен, т.к. не отображает файл на странице.. закапываюсь. Помогайте. ((((

Третий скрипт - собственно, обработчик запроса. Он до последнего момента вроде как работает верно, при вставке флажков алертом выдает правильные пути... но в последний момент выводит ошибку!! Сколько ни бился, не смог уяснить, почему!

docs.php

<?php
session_start
();
if (
$_GET['confirm']==1) {
    echo 
"Подождите...<br>";
    require_once(
"ftp.php");
    echo 
"<script>alert('".$_SESSION['file_remote']."')</script><br>";
    echo 
"<script>alert('".$_SESSION['file']."')</script><br>";
    
ftp_mkdir($link"/documents/".$_SESSION['created_dir']);
    
$ret ftp_nb_put($link$_SESSION['file_remote'], $_SESSION['file'], FTP_BINARY);
     while (
$ret == FTP_MOREDATA) {
         echo 
".";
        
$ret ftp_nb_continue($link);
      }
      if (
$ret != FTP_FINISHED) {
        echo 
"<br><b><font color='red'>Во время загрузки файла произошла ошибка!</font></b>";
        exit();
      } else {
        foreach(
$_SESSION['queries'] as $query) {
        
$res=mysql_query($query);
        if (!
$res) { $error=1; }
    }
        if (empty(
$error)) {
            echo 
"<h4>Документ был успешно размещен на FTP-сервере.</h4>";
        } else {
            echo 
"<h4><font color='red'>Во время выполнения запроса произошла ошибка. Проверьте корректность введенных данных и повторите попытку </font></h4>";
        }
    }
}


Вот на этом-то этапе мы и запинаемся. И хоть об стенку разбейся - не кладет. На вас одна надежда.... (((((

   
 
 автор: cheops   (09.07.2006 в 10:46)   письмо автору
 
   для: Anwor   (08.07.2006 в 23:25)
 

А последний скрипт какую ошибку выводит? Срабатывает условие $ret != FTP_FINISHED?

   
 
 автор: Anwor   (09.07.2006 в 13:13)   письмо автору
 
   для: cheops   (09.07.2006 в 10:46)
 

Да, именно она.
Т.е. самая "какость" ФТП-функций как раз-таки в том, что здесь не выведешь в мессагу что-то конкретное об ошибке, как это есть у Мускул-функций (mysql_error()). Вот и приходится гадать, флажки выводить и пр., тем не менее всё равно не фурычит (((
Так вроде всё правильно написал... может кто-нибудь разобраться, в чем тут косяк?

   
 
 автор: cheops   (09.07.2006 в 13:47)   письмо автору
 
   для: Anwor   (09.07.2006 в 13:13)
 

Имена директории и файла английские (т.е. нет там русских символов)?

   
 
 автор: Anwor   (09.07.2006 в 23:02)   письмо автору
 
   для: cheops   (09.07.2006 в 13:47)
 

Нет конечно. А не может быть гвоздь в том, что при выкладке на ФТП-шник мы здесь не указываем права доступа к нему, а-ля 0707 или 0754? Он из-за этого косячить не может?

   
 
 автор: cheops   (10.07.2006 в 11:16)   письмо автору
 
   для: Anwor   (09.07.2006 в 23:02)
 

А вполне может быть (это зависит от того, какая маска на сервере umask) - сразу после создания директории попробуйте изменить её права при помощи функции ftp_chmod().

   
 
 автор: Anwor   (12.07.2006 в 10:03)   письмо автору
 
   для: cheops   (10.07.2006 в 11:16)
 

Подскажите, плз, 2 вещи..

1) Есть хост HOST.RU и есть на нем мой субдомен USER.HOST.RU. При коннекте к ФТП я пишу ftp_server="HOST.RU", в то время как папка USER.HOST.RU является корневой для моего сайта. Вот и вопрос: при указании пути для размещения файла - нужно ли указывать эту самую папку? Пример: я указываю /documents/folder/file, а не надо ли так: user.host.ru/documents/folder/file?

2) Каково время жизни у данных в массиве $_FILES?

   
 
 автор: Anwor   (12.07.2006 в 11:14)   письмо автору
 
   для: Anwor   (12.07.2006 в 10:03)
 

Пардон, вопросы отпали сами собой.

Теперь хочу спросить о небольшой хитрости.. В общем скрипт мой заработал, но дело в том, что когда в поле file помещается крупный файл, скажем, 3 Мб, то РНР, вместо того чтобы первым делом вывести "ПОДОЖДИТЕ..." и картинку с песочными часами, сначала долго-долго подгружает его в сессионный темп. Когда ему остается уже на сервере только скопировать здоровый файл из 1 места в другое, то он обновляет страницу, и тут же говорит, что файл загружен. Проще говоря: надо, чтобы он сначала сказал о том, что началась загрузка, а уже потом начал саму загрузку, сейчас у меня страница висит по 5 минут и ничего не помогает.
Код сейчас такой:

<?php
if (isset($_POST['upload'])) {
    
$error="";
    if (empty(
$_FILES['file_path']['name'])) {
        
$error.="<LI>Не выбран путь к файлу на жестком диске \n";
    } 
    if (empty(
$_POST['file_name'])) $error.="<LI>Не указано имя документа \n";
    if (empty(
$_POST['file_folder'])) $error.="<LI>Не выбрано дело \n";
    if (empty(
$_POST['file_note'])) $error.="<LI>Нет описания документа \n";
    if (!empty(
$error)) {
        print 
"<font color='red'>Ошибка запроса!</font><font color='red'><br>
        
$error</font>";
    } else {
                                           
//тут идет огромный блок MySQL-запросов........
        
echo "<b>Подождите, идет загрузка...<br>";
        echo 
'<p align="center"><object width="50" height="70">
          <param name="movie" value="img/clock.swf">
          <param name="quality" value="high">
          <embed src="img/clock.swf" quality="high" type="application/x-shockwave-flash" width="100" height="100"></embed>
        </object></p>'
;
        
$path_parts=pathinfo($_FILES['file_path']['name']); 
                                           
$ext=$path_parts["extension"]; 
        
$remote_name=$_POST['file_name']."_$file_id.$ext";
        
$file_remote="/documents/".$_POST['file_folder']."/".$remote_name
        require(
"ftp.php");
        
$ret ftp_nb_put($link$file_remote$_FILES['file_path']['tmp_name'], FTP_BINARY);
          while (
$ret == FTP_MOREDATA) {
            
$ret ftp_nb_continue($link);
          }
          if (
$ret != FTP_FINISHED) {
            echo 
"<br><font color='red'><b>Во время загрузки файла произошла ошибка...</b></font>";
            exit();
          } else {
              
$copy_result=1;
          }
        if (
$copy_result) {?>
/////////////дальше код исторической ценности не имеет.

   
 
 автор: Anwor   (12.07.2006 в 15:23)   письмо автору
 
   для: Anwor   (12.07.2006 в 11:14)
 

Люди, помогите плиз!

   
 
 автор: Trianon   (12.07.2006 в 15:25)   письмо автору
 
   для: Anwor   (12.07.2006 в 11:14)
 

Скрипту передается управление лишь тогда, когда файл уже попал на сервер.

   
 
 автор: Anwor   (12.07.2006 в 17:04)   письмо автору
 
   для: Trianon   (12.07.2006 в 15:25)
 

т.е. сначала высылается форма и всё, что в ней, а потом уже запускается скрипт, верно?

Нет ли какого-либо способа обойти этот момент и вывести сообщение "Подождите..." раньше, чем начнет грузиться файл? Может, ЯваСкриптом можно?

   
 
 автор: Anwor   (13.07.2006 в 13:07)   письмо автору
 
   для: Anwor   (12.07.2006 в 17:04)
 

Прочитал в справочнике функций про ftp_nb_get(), там выложен код скрипта (т.е. их 3):

<?php 
$ret 
ftp_nb_get($my_connection"test""README"FTP_BINARY); 
while (
$ret == FTP_MOREDATA

  echo 
"."
   
$ret ftp_nb_continue($my_connection); 

if (
$ret != FTP_FINISHED

   echo 
"There was an error downloading the file..."
   exit(
1); 

?> 

В каждом из трех скриптов в качестве local_file и remote_file принимаются соответственно "test" и "README". В принципе, если этот скрипт выложить, то работает он нормально, если, конечно, есть файл "README". Вопрос возникает тогда, когда скопированный файл "test" объявляется в той же директории!
1. Как бы так организовать работу скрипта, чтобы пользователь сам мог выбирать путь и имя файла на своем клиентском компе?
2. Собственно, животрепещуще: как реализовать саму скачку?? Подставлял вместо "test" и "c:\file.txt", и "c:/file.txt", и что только не, но - по барабану: как только путь ведет на локальную машину, тут же нагло выводим ошибку и затыкаемся. В чем может заключаться проблема?
3. Может, есть вообще какой-то альтернативный метод скачки файла, с помощью заголовков or somethin'? Как вообще с помощью заголовка организовать подключение к ФТП-серверу?

Буду очень признателен, если ответите..

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования