|
|
|
| Всем доброго времени суток.
Прошу мне помочь, проблема отлагательств не терпит, в общем, нужно мне организовать инструмент взаимодействия с ФТП. К выкладываемым файлам имеют доступ все, т.е. гемора с ЮНИХовыми правами доступа не нужно совсем...
Поскольку архитектура данного инструмента кардинально отличается от ФТП-Менеджера из 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>";
}
}
}
|
Вот на этом-то этапе мы и запинаемся. И хоть об стенку разбейся - не кладет. На вас одна надежда.... ((((( | |
|
|
|
|
|
|
|
для: Anwor
(08.07.2006 в 23:25)
| | А последний скрипт какую ошибку выводит? Срабатывает условие $ret != FTP_FINISHED? | |
|
|
|
|
|
|
|
для: cheops
(09.07.2006 в 10:46)
| | Да, именно она.
Т.е. самая "какость" ФТП-функций как раз-таки в том, что здесь не выведешь в мессагу что-то конкретное об ошибке, как это есть у Мускул-функций (mysql_error()). Вот и приходится гадать, флажки выводить и пр., тем не менее всё равно не фурычит (((
Так вроде всё правильно написал... может кто-нибудь разобраться, в чем тут косяк? | |
|
|
|
|
|
|
|
для: Anwor
(09.07.2006 в 13:13)
| | Имена директории и файла английские (т.е. нет там русских символов)? | |
|
|
|
|
|
|
|
для: cheops
(09.07.2006 в 13:47)
| | Нет конечно. А не может быть гвоздь в том, что при выкладке на ФТП-шник мы здесь не указываем права доступа к нему, а-ля 0707 или 0754? Он из-за этого косячить не может? | |
|
|
|
|
|
|
|
для: Anwor
(09.07.2006 в 23:02)
| | А вполне может быть (это зависит от того, какая маска на сервере umask) - сразу после создания директории попробуйте изменить её права при помощи функции ftp_chmod(). | |
|
|
|
|
|
|
|
для: 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 в 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 в 11:14)
| | Люди, помогите плиз! | |
|
|
|
|
|
|
|
для: Anwor
(12.07.2006 в 11:14)
| | Скрипту передается управление лишь тогда, когда файл уже попал на сервер. | |
|
|
|
|
|
|
|
для: Trianon
(12.07.2006 в 15:25)
| | т.е. сначала высылается форма и всё, что в ней, а потом уже запускается скрипт, верно?
Нет ли какого-либо способа обойти этот момент и вывести сообщение "Подождите..." раньше, чем начнет грузиться файл? Может, ЯваСкриптом можно? | |
|
|
|
|
|
|
|
для: 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'? Как вообще с помощью заголовка организовать подключение к ФТП-серверу?
Буду очень признателен, если ответите.. | |
|
|
|