Михаил И.
33 сообщения
#15 лет назад
Пишу программу которая сливает файлы с сервера и передает ее на другой по FTP.

Вот код:
<?php
set_time_limit(300);
$action = $_GET;
if (empty($action))
{
echo '<form action="?action=on" method="POST">';
echo 'url-адрес файла:<input type="text" name="url"><br>';
echo 'имя файла для сохранения на ftp-папке(<font color="red">обязательно с расширением тоесть имя_файла.расширение пример "name.exe"</font><br>';
echo '<input type="text" name="nam">';
echo 'Данные вашего ftp-аккаунта (<font color="red">нигде не сохраняются</font>)<br>';
echo 'ftp-сервер:<input type="text" name="serv"><br>';
echo 'логин:<input type="text" name="login"><br>';
echo 'пароль:<input type="password" name="pasword"><br>';
echo '<input type="submit" value="загрузить"></form>';
}
else
{
$url = $_POST;
$nam = $_POST;
$serv = $_POST;
$login = $_POST;
$pasword = $_POST;
$fh = fopen("$url", "r");
while(!feof($fh))
{
$line = fgets($fh);
$f = fopen("$nam", "a");
fwrite($f,$line);
fclose($f);
}
fclose($fh);
$connect = ftp_connect("$serv")or die("He удалось подключиться к серверу");
$login_result = ftp_login($connect,$login,$pasword)or die("He удалось зарегистрироваться на сервере");
ftp_put($connect, "$nam", "$nam",FTP_ASCII);
ftp_quit($connect);
echo "Все!!!";
}
?>


проблема в том что при передаче файлов по FTP они почему то сохраняются ноль байтными
ПОЧЕМУ?
Виталий Я.
659 сообщений
#15 лет назад
$fh = fopen("$url", "r");
while(!feof($fh))
{
$line = fgets($fh);
$f = fopen("$nam", "a");
fwrite($f,$line);
fclose($f);
}

Больше всего смущает первая строчка . Если у вас в php_info url_fopen не true , то может быть что файл просто не открывается .
Особенно часто такое на бесплатных хостингах .
Михаил И.
33 сообщения
#15 лет назад
Хостинг платный
PHP, MySQL, Perl, DirectAdmin, Apache, CGI-BIN, Zend, Python, C, C++, Curl, Awstats, Webalizer, .htaccess, Cron, MIME, АнтиСпам, Антивирус, SSL/TLS, Installatron Script Installer,
Станислав Малкин
1410 сообщений
#15 лет назад
print_r($nam);
Михаил И.
33 сообщения
#15 лет назад
Цитата ("ArtLab"):
print_r($nam);


Извините не понял ваш намек?
Станислав Малкин
1410 сообщений
#15 лет назад
Допишите это в код.
Алексей Б.
897 сообщений
#15 лет назад
Не дописывайте.
Вы видимо из под файерволла пытаетесь скрипт запустить.
21 порт используется только для управления, для передачи данных нужен 20.
Евгений М.
6 сообщений
#15 лет назад
Для начала можно заменить
while(!feof($fh))
{
$line = fgets($fh);
$f = fopen("$nam", "a";
fwrite($f,$line);
fclose($f);
}
fclose($fh);

Замени на:
$cont=file_get_contents($url) or die("Не могу считать $url";
file_put_contents($nam,$cont) or die("Не могу сохранить $nam";

Ну а дальше:
$conn_id = ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// проверка соединения
if ((!$conn_id) || (!$login_result)) {
echo "Не удалось установить соединение с FTP сервером!";
echo "Попытка подключения к серверу $ftp_server под именем $ftp_user_name!";
exit;
} else {
echo "Установлено соединение с FTP сервером $ftp_server под именем $ftp_user_name";
}

// закачивание файла
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);

// проверка результата
if (!$upload) {
echo "Не удалось закачать файл!";
} else {
echo "Файл $source_file закачен на $ftp_server под именем $destination_file";
}

// закрытие соединения
ftp_close($conn_id);
Михаил И.
33 сообщения
#15 лет назад
Списбо большое evgeniy1
Одну проблему решил.
скаченный файл не сохранялся это из-за того что права на папке в которой был скрипт были 755
Одна проблема осталась соединение с фтп создается но файл не закачивается и мне кажется я знаю почему у меня на сервере стоит safe mod и владельцем всех файлов созданных скриптами является apache а это значит что их нельзя ни копировать не удалять.
Алексей Б.
897 сообщений
#15 лет назад
Апач не имеети никакого отношения к фтп.
если при нажатии "загрузить" файл сохраняется в папке со скриптом, а на фтп он создается, но размер = 0, значит проблема в 20м порту.
Михаил И.
33 сообщения
#15 лет назад
Господа спасибо за внимание уже во всем разобрался пришлось найти другой способ ftp передачи и я его нашел:
Теперь скрипт работает с двойной скоростью тоесть как только скачался первый фрагмент кода тут же этот фрагмент сохраняется на стороннем фтп сервере
вот сам код кому интересно
<?php
set_time_limit(300);
$action = $_GET;
if (empty($action))
{
echo '<form action="?action=on" method="POST">';
echo 'url-адрес файла:<input type="text" name="url"><br>';
echo 'имя файла для сохранения на ftp-папке(<font color="red">обязательно с расширением тоесть имя_файла.расширение пример "name.exe"</font><br>';
echo '<input type="text" name="nam">';
echo 'Данные вашего ftp-аккаунта (<font color="red">нигде не сохраняются</font>)<br>';
echo 'ftp-сервер:<input type="text" name="serv"><br>';
echo 'При необходимости укажите точную директорию:<input type="text" name="dir" value="/имя_директории/"><br>';
echo 'логин:<input type="text" name="login"><br>';
echo 'пароль:<input type="text" name="pasword"><br>';
echo '<input type="submit" value="загрузить"></form>';
}
else
{
$url = $_POST;
$nam = $_POST;
$serv = $_POST;
$login = $_POST;
$pasword = $_POST;
$dir =$_POST;
if($dir == "/имя_директории/")
{
$dir = "/";
}
else
{
}
$fh = fopen("$url", "r");
$f = fopen("ftp://$login:$pasword@$serv$dir$nam", "a") or die("Не удалось получить доступ к серверу!!!");
while(!feof($fh))
{
$line = fgets($fh);
fwrite($f,$line);
}
fclose($f);
fclose($fh);
echo "Файл успешно закачан";
}
?>

Для чего нужен:
Любому веб мастеру приходится всегда переливать кучу файлов а благодаря этого скрипта трафик вашего интернета никак не используется а учесть что на большинстве хостингов трафик неограничен то вообще шикарно.
Плюсы такого скрипта для сервера
Во первых из этого фрагмента кода
$fh = fopen("$url", "r");
$f = fopen("ftp://$login:$pasword@$serv$dir$nam", "a") or die("Не удалось получить доступ к серверу!!!");
while(!feof($fh))
{
$line = fgets($fh);
fwrite($f,$line);
}
fclose($f);
fclose($fh);

Явно видно что оперативная память сервера используется динамически
фрагментик большого файла загружается в оперативку и тут же пререзагружается на сторонний сервер в итоге от оперативки за всю работу нужно только 100 байт памяти проверял
тоесть нагрузки на сервер никакой только трафик, но трафик у меня анлим, думаю у ваших хостингов тоже
вообщем и волки сыты и овцы целы