Forum Webscript.Ru

Программирование => PHP => Тема начата: Helios от 13 Августа 2002, 00:45:25

Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 13 Августа 2002, 00:45:25
Можно ли как нибудь организовать (необязательно на PHP) скачивание файлов с запароленного FTP сервака, чтобы при этом нигде не отображались логин и пароль от этого сервака. (Anymous доступ к серваку невозможен).
Заранее большое спасибо!
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 13 Августа 2002, 01:31:01
Смотри ftp-functions в мануале.
Название: PHP и скачивание файлов с FTP
Отправлено: Макс от 13 Августа 2002, 02:23:13
Цитировать
с запароленного FTP сервака, чтобы при этом нигде не отображались логин и пароль от этого сервака
как ты себе это представляешь ?
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 13 Августа 2002, 13:09:14
В каком Мануале (К чему Мануале?)?
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 13 Августа 2002, 13:10:55
TO Макс:
Я себе это не могу представить, поэтому и спрашиваю...
Название: PHP и скачивание файлов с FTP
Отправлено: Alexandr от 13 Августа 2002, 13:54:06
Цитировать
В каком Мануале

Вот в этом
http://www.php.net/manual/en/ref.ftp.php
Цитировать
К чему Мануале?

К PHP функциям работающими с ftp.
Название: PHP и скачивание файлов с FTP
Отправлено: Макс от 13 Августа 2002, 17:37:47
Цитировать
Я себе это не могу представить, поэтому и спрашиваю...
Если сервак запаролленый, то к нему без логина/пароля подключиться нельзя (кроме взлома сервака ).
Поэтому логин или пароль должны быть известны скрипту. Либо прямо указаны в переменных либо должны вводится пользователем при запуске скрипта
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 13 Августа 2002, 18:21:37
TO Макс:
Я логин и пароль знаю и хочу, чтобы они "были известны" только скрипту и скрыты от пользователя.
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 13 Августа 2002, 18:28:26
Helios
Так впиши его в скрипт - и никому его (скрипт) не показывай.
Тебе все равно придется их указывать в явном виде при подключении
Опять же - внимательно читаем мануал.
Название: PHP и скачивание файлов с FTP
Отправлено: Макс от 13 Августа 2002, 18:32:21
Цитировать
и скрыты от пользователя.
а скрипт будет выдаваться пользователю? (в смысле исходники будут доступны пользователю?). Если да - то безопасность обеспечить ИМХО почти нельзя (можно как-то спрятать логин/пароль но профи  смогут его найти).
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 13 Августа 2002, 18:36:52
Макс
Как они будут доступны?
Твои исходники доступны пользователю?
Название: PHP и скачивание файлов с FTP
Отправлено: Макс от 13 Августа 2002, 18:43:05
ThE0ReTiC
Я просто не пойму что он хочет. Если исходники не доступны, то почему он так переживает.

Цитировать
Твои исходники доступны пользователю?
Я уж думал что он какой-то скрипт делает свободным для скачивания, который будет соединятся с FTP и скачивать от туда файлы и поскольку исходники открыты он боится за логин/пароль к FTP
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 13 Августа 2002, 19:44:40
Попробую все объяснить сначала и подробно:
Есть FTP сервер (места неограничено и вообще не никаких ограничений), доступ к которому возможен только по паролю и логину (Anymous доступа нету). Вот я на этот сервер скинул пару песенок и хочу чтобы они стали доступны для посетителей сайта. А для этого я хочу написать (достать, спросить) скрипт, который бы позволял посетителям сайта скачивать эти песни, однако чтобы "явным образом" не было видно пароля (чтобы была минимальная защита от дураков).

To ThE0ReTiC и Макс:
Вся проблема заключается в НАПИСАНИИ такого скрипта. Не подскажете, а еще лучше напишите такой скрипт, плиз. (А я на сайте ссылочку повешу, что "Этот скрипт написал (А дальше ник и e-mail, того кто помог")
Название: PHP и скачивание файлов с FTP
Отправлено: Макс от 13 Августа 2002, 22:53:38
Helios
а доступа к содержимому FTP-сервера через HTTP нету?

Насчет скрипта, то пароли можешь смело прописывать в скрипте
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 14 Августа 2002, 00:01:14
Доступа через http нету, вообще из всех вариантов доступа есть только парольный ftp.
Пароли буду в скрипте прописывать, только его сначала сочинить надо.
Название: PHP и скачивание файлов с FTP
Отправлено: Дмитрий Попов от 14 Августа 2002, 00:31:53

// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// check connection
if ((!$conn_id) || (!$login_result)) {
        echo "FTP connection has failed!";
        echo "Attempted to connect to $ftp_server for user $ftp_user_name";
        die;
    } else {
        echo "Connected to $ftp_server, for user $ftp_user_name";
    }

// upload the file
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);

// check upload status
if (!$upload) {
        echo "FTP upload has failed!";
    } else {
        echo "Uploaded $source_file to $ftp_server as $destination_file";
    }

// close the FTP stream
ftp_close($conn_id);
?>


Чем этот скрипт (вернее пример из мануала) не устраивает?
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 14 Августа 2002, 00:55:07
Дмитрий Попов
Это закачка на сервер, дарагой.
Для отдачи файлов пользвателям этот скрипт надо обработать напильником.
:):):)
Helios
В скрипте пиши и не мучайся. СОчинить не сложно - мануал посмотри.
Могу дать класс для работы с FTP (правда он немного не дописан, он нужные тебе функции там есть)
Название: PHP и скачивание файлов с FTP
Отправлено: Дмитрий Попов от 14 Августа 2002, 01:03:32
ThE0ReTiC
Ууупс... Саавсем паверхнастна пасматрел, да?. :-))
Хорошо, мы тут эту строчку заменим:

$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY);

На эту:


$upload = ftp_get ( $conn_id, $local_file, $remote_file, FTP_BINARY);


Helios:
Это действительно просто. Скрипт перед Вами... осталось чуть-чуть передел
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 14 Августа 2002, 01:57:41
Дмитрий Попов
[OFF]Если бы я поверхностно посмотрел - то ничего бы не написал.
Я ж сказал - обработать напильником, что ты и сделал[/OFF]
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 14 Августа 2002, 13:36:28
ThE0ReTiC
Дай, плиз, клас для работы с FTP. А вось разберусь?

Дмитрий Попов
Я видел этот пример в мануале, однако $local_file надо в каком виде указывать (просто название.расширение или полный путь куда должно записываться, типа c:/название.расширение), и переменную $remote_file надо как указывать (полный путь к файлу, допустим /pub/files/название.расширение)? И еще вопрос: что из себя представляет процесс скачивания таким образом файла (Просто будет втихаря полчаса работать браузер, пока будет скачиваться файл, или эту файл "подхватит" и начнет скачивать GetRight (ReGet и т.д.))?
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 14 Августа 2002, 14:33:59
Ненавижу вопросы, которые задаются даже без малейшей попытки подумать перед этим своей головой.
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 14 Августа 2002, 14:35:05
ThE0ReTiC
А чем хороштвой класс?
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 14 Августа 2002, 14:37:52
Доктор
Да ничем. я его просто так сделал - ради тренировки
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 14 Августа 2002, 14:39:10
Доктор
Я просто абсолютно не знаю, как работает FTP с PHP (даже в Мануале я не нашел подробного описания), и с принципом работы FTP я знаком только на уровне "выгрузки файлов на сервер".
Название: PHP и скачивание файлов с FTP
Отправлено: Дмитрий Попов от 14 Августа 2002, 19:09:22
ThE0ReTiC
Я имел ввиду, что я посмотрел поверхностно (Вы меня не так поняли:-D)

Helios
Причем тут C:// ?

Вы на сервер сохраняете файл, а потом просто отдаете его в браузер fread\'ом.

Чего-то мне кажется Вы вообще PHP почти не изучали...
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 14 Августа 2002, 21:54:46
Дмитрий Попов
PHP я изучал (правильнее сказать "изучаю").
А вот Файловые операции в PHP действительно почти не изучал, да и опыта практического мало...

А Вы не могли по подробнее написать, что должен fread в данном случае делать?
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 14 Августа 2002, 22:40:37
Helios
Цитировать
fread

Вообще-то считывает определенное количество байт из файла.
Немного не понимаю, каким боком он здесь затесялся, особенно если учесть, что считанная информация передается в переменную.
Если надо напрямую в броузер, то не проще ли воспользоваться readfile ?
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 15 Августа 2002, 00:43:33
ПОЖАЛУЙСТА ПОМОГИТЕ!
Скажите же, что надо после $upload = ftp_get ( $conn_id, $local_file, $remote_file, FTP_BINARY); делать?
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 15 Августа 2002, 01:03:02
Helios

Header("Content-Type: ...");
readfile($local_file);

Типа того.
COntent-Type пропишешь в зависимости от типа отдаваемого файла (архив, кино, картинка, etc...)
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 15 Августа 2002, 03:12:08
А если реально подумать, то какая же чепуха это все. Сколько этот файл, если он хоть немного  приличных размеров, будет качаться по ftp сначала... ни один юзер не выдержит...
Название: PHP и скачивание файлов с FTP
Отправлено: Дмитрий Попов от 15 Августа 2002, 03:27:38
ThE0ReTiC
Это... ошибся, не ту функцию дал (извуняюсь... с кем не бывает). Конечно я имел ввиду readfile...

Доктор
Это уже другой вопрос...

Можно делать хитро (как opensource.net, правда они с другой целью) - ставить сессию, где человек выбирает какой-то бред, и начинается сессия... Пока человек выбирает, файл начинает скачиваться... Когда выбрал - надпись
"Вы должны подождать 10 минут. Это сделано с целью..." а дальше впаривать доверчивого юзера...:-D

Кто обяъснит Гелиосу как это делать? :-)))

Helios
То, что я написал выше - шутка, конечно... А над словами Доктора задумайтесь...
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 15 Августа 2002, 15:09:55
Я думаю, если файл будет 5, 10, а то 100МБ (точнее 103МБ) десятью минутами дело не ограничется...
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 15 Августа 2002, 15:25:48
Похоже придется давать ссылку посетителям сайта вместе с логином и паролем, надеясь на их порядочность...
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 15 Августа 2002, 15:30:43
А анонимный доступ организовать не проще?
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 15 Августа 2002, 15:42:45
ThE0ReTiC
Один знакомый попросил своего знакомого, работающего в известной хостинг компании, организовать по дружбе неограниченное пространство. Он организовал неограниченное простарнство, однако, чтобы не получить себе проблемы, он смог организовать только парольный доступ. По его словам все бы сразу обнаружили "левый" ftp доступ.

Вот такая грустная история...
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 15 Августа 2002, 15:45:44
Helios
Конечно обнаружили бы...
Warez?
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 15 Августа 2002, 16:02:58
Ладно, поприкалывались, и хватит.
Смотрим мануал:

Цитировать

int fopen (string filename, string mode [, int use_include_path])

If filename begins with "ftp://" (not case sensitive), an ftp connection to the specified server is opened and a pointer to the requested file is returned. If the server does not support passive mode ftp, this will fail. You can open files for either reading or writing via ftp (but not both simultaneously).


Скрипт get_ftp_file.php.   Как параметр для вызова filename (т.е. ссылка прописывается так: скачать картиночки ;))

Пишем такой код для этого файла:


$f=fopen("ftp://$ftp_username:$ftp_password@needed.domen.com/path/$filename", "r");

if (! $f) {
  echo "Incorrect file name or server does not support passive mode ftp";
  exit;
  }


// Тип файла $content_type в общем случае нужно
// определить либо из расширения запрашеваемого
// файла $filename, либо по таблице соответствия,
// которую составить, включив в нее всенаши файлы,
// доступные для скачивания
// Пока так:

$content_type="application/zip";
header("Content-Type: $content_type");


// Content-Length я вообще не уверен, что надо
// обязательно выдавать, а проверять влом, но,
// если выдавать, то тут тоже есть 2 пути:
// 1. Тоже таблица, составленная для всех наших файлов.
// 2. Лучшие и универсальнее узнать с помощью ftp_size
// (перед которой, естесственно ftp_connect, и ftp_quit после)
// Пока так, как будто знаем:
$content_length=26454;
header("Content-Length: $content_length");

set_time_limit (0);

while (!feof ($f)) {
    $buffer = fread($f, 4096);
    echo $buffer;
    flush();
    }


fclose($f);
?>


Теоретически должно работать.
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 15 Августа 2002, 19:12:43
ThE0ReTiC
Да никакой не Warez. Просто видеоклипы и mp3 нескольких групп.

Доктор
Ты гений! ВСЕ ЗАРАБОТАЛО! Огромное тебе спасибо! На странице, с этими ссылками у себя на сайте повешу тебе благодарность!
Однако все-же есть две мелочи:
1) Нельзя ли как нибудь сделать, что-бы Download\'ер (GetRight в моем случае) сразу в качестве имени сохраняемого файла ставил реальное имя файла, а не имя и расширение скрипта.
2 (Крупная мелочь)) Нельзя ли как-нибудь сделать возможной докачку файлов? (Все же как-то не очень удобно за один раз скачать 10 -12 МБ)

И еще:
А где можно узнать, какому расширению соответствует какой Content-Type?
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 15 Августа 2002, 20:14:02
1) Попробуй выдать такие заголовки:
Там, где Content-Type, добавить имя файла через точку с запятой, хотя не знаю обязательно ли, а экспериментировать самому лень:
header("Content-Type: $content_type;name=$filename");

А также еще один заголовок:
header("Content-Disposition: attachment; filename=$filename");

Не уверен, обязательно ли слово attachment, может быть можно просто:
header("Content-Disposition: filename=$filename");

Причем опять же, может быть, что достаточно одного из этих заголовков, надо бы было просто поэкспериментировать с разными браузерами и качалками.

2) Дозакачка вообще сложный вопрос. Как я понимаю, специально для этого придуман заголовок Content-Range:
header("Content-Range: $start-$end/$size");
Интересно, как узнать от клиента этот $start...
То-есть, может быть, что-то и можно было бы придумать, но сильно геморно... А ведь некоторые качалки еще по частям качают...
Не стоит мучаться.

3) MIME-типы можно посмотреть, например, у Апача в файле mime.types
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 15 Августа 2002, 21:42:05
Доктор
А нет ли где-нибудь подробного описания всех существующих "заголовков"?
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 15 Августа 2002, 21:44:42
Доктор
А что означает переменная $end в заголовке Content-Range.
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 15 Августа 2002, 23:16:29
Описания всех существующих заголовков у меня нет.

$start и $end - по идее номера первого и последнего байтов текущего куска относительно всего файла.
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 15 Августа 2002, 23:50:43
То есть $start всегда равна 1 (единице), а $end равна размеру скаченного пользователем куска?
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 16 Августа 2002, 00:34:14
Нет, по идее $start=размер_скачанного_ранее_куска+1, а $end=размер_текущего_куска.

А вообще я ж говорю: забудь и не заморачивайся.
С именем получилось хоть?
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 16 Августа 2002, 00:39:15
Helios
Есть конечно.
Поищи в RFC архивах
Название: PHP и скачивание файлов с FTP
Отправлено: Tronyx от 16 Августа 2002, 00:40:40
Люди вопрос на засыпку! А с помощью mod_rewrite эту проблему не решеть? Вот идея: все запросы к файлам в папке /files, будут переписываться на ftp сервер.
Пример:
Было - site.ru/files/music.mp3
Стало - frp://логин::пароль@ftp_site.ru/music.mp3

По идеи всё нормально будет(не проверял), но наверное в качалке юзера "пролезет" настоящее имя файла. Если я не прав поправьте :)
Название: PHP и скачивание файлов с FTP
Отправлено: Макс от 16 Августа 2002, 00:45:29
Tronyx
Цитировать
frp://логин::пароль@ftp_site.ru/music.mp3
так логин и пароль будут открытыми.
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 16 Августа 2002, 00:51:18
ThE0ReTiC
Что такое "RFC архивы"?

Доктор
Да, с именем получилось:
header("Content-Type: $content_type;name=$filename");
header("Content-Disposition: attachment; filename=$filename");
Правда я еще не пробовал убирать attachment; и name=$filename");
Название: PHP и скачивание файлов с FTP
Отправлено: Макс от 16 Августа 2002, 00:54:04
Tronyx
Или это вообще не будет работать, так как ftp-сервер и http-сервер физически находятся в разных местах


Helios
RFC - это описание стандартов. http://www.rfc-editor.org
Название: PHP и скачивание файлов с FTP
Отправлено: ThE0ReTiC от 16 Августа 2002, 00:54:43
Helios
A RFC архивы - это сборник стандартов...
Класная весчь Яньдекькс. Попользуйся, коли тебе интересно.
Название: PHP и скачивание файлов с FTP
Отправлено: Tronyx от 16 Августа 2002, 02:06:23
Цитировать
Или это вообще не будет работать, так как ftp-сервер и http-сервер физически находятся в разных местах

А это паралельно.
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 16 Августа 2002, 02:23:01
А еще MIME-типы можно смотреть в типах файлов в виндозе.
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 16 Августа 2002, 02:24:19
Tronyx
Вся эта заморочка и нужна-то была только для того, чтобы спрятать от подлого юзера логин с паролем...
Название: PHP и скачивание файлов с FTP
Отправлено: Tronyx от 16 Августа 2002, 09:46:43
Цитировать
Tronyx
Вся эта заморочка и нужна-то была только для того, чтобы спрятать от подлого юзера логин с паролем...

А вот что написал я:
Цитировать
но наверное в качалке юзера "пролезет" настоящее имя файла
Если я не прав поправьте
Название: PHP и скачивание файлов с FTP
Отправлено: Макс от 17 Августа 2002, 15:57:28
Кстати о докачке, пример есть в faq-е с ru.php
Лежит на faq.saterenko.ru
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 17 Августа 2002, 17:20:11
Макс
http://faq.saterenko.ru/index18.html
Оно?
Название: PHP и скачивание файлов с FTP
Отправлено: Helios от 17 Августа 2002, 17:33:42
Доктор и Макс
Огоромное Вам двоим спасибо! На основе скрипта Доктора и ссылки, данной Максом, получился скрипт скачивающий с FTP и поддерживающий докачку! Ваши имена и mail\'ы через недельку-другую будут с благодарностью вывешены на http://www.moderntalking.org/mp3.php!

Если кому надо, вот конечный вариант скрипта:
$filename = "pornuha_warez.zip";
$ftp_username = "login";
$ftp_password = "password";
$server = "pornuhaandhack.ru";
$content_length=51638;
$fd = @fopen("ftp://$ftp_username:$ftp_password@$server/$filename", "rb");


if ($HTTP_SERVER_VARS["HTTP_RANGE"]) {
  $range = $HTTP_SERVER_VARS["HTTP_RANGE"];
  $range = str_replace("bytes=", "", $range);
  $range = str_replace("-", "", $range);
  if ($range) {fseek($fd, $range);}
}
$content = fread($fd, $content_length);
fclose($fd);
if ($range) {
  header("HTTP/1.1 206 Partial Content");
}
else {
  header("HTTP/1.1 200 OK");
}
header("Content-Disposition: attachment; filename=$filename");
header("Accept-Ranges: bytes");
header("Content-Length: ".($content_length-$range));
header("Content-Range: bytes $range-".($content_length -1)."/".$content_length);
header("Content-type: application/octet-stream");
print $content;
exit;
?>
Название: PHP и скачивание файлов с FTP
Отправлено: Доктор от 17 Августа 2002, 17:44:37
Цитировать
Оно?


Да, сам фижу, что оно. Все нормально и понятно. Только не понялвот этого:


if ($HTTP_SERVER_VARS["HTTP_RANGE"]) {
  $range = $HTTP_SERVER_VARS["HTTP_RANGE"];
  $range = str_replace("bytes=", "", $range);
  $range = str_replace("-", "", $range);
  if ($range) {fseek($fd, $range);}
 

А конкретно почему:

  $range = str_replace("bytes=", "", $range);
  $range = str_replace("-", "", $range);
 

Получается просто сливаем начало и конец диапазона?
bytes=1024-2048
Получается range=10242048
Или я не правильно понимаю что-то (например формата $HTTP_SERVER_VARS["HTTP_RANGE"])???