Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Передача файла с другого сервера пользователю (satsura, оценка: 5)
Author Message
satsura
Заглянувший



Joined: 08 Aug 2007
Posts: 14
Карма: 0
   поощрить/наказать

Location: Беларусь

PostPosted: Fri Jan 04, 2008 9:54 am (написано за 42 секунды)
   Post subject: Передача файла с другого сервера пользователю
Reply with quote

Есть такая вот задачка:
Имеется два сервера: "СИ" - сервер-интерфейс, "СХ" - сервер-хранилище.
Пользователь авторизуется на СИ и ему показываются файлы, которые находятся на СХ, он выбирает файл для загрузки, и причем загрузка должна происходить таким образом, чтобы нельзя было использовать "Качалки", а также нельзя было передавать дынный урл, другому пользователю. И еще сам файл не должен при вытаскивании с "СХ" сохраняться в промежутке на "СИ".
Скажите это реально сделать? И если да, то как?
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Fri Jan 04, 2008 5:06 pm (спустя 7 часов 11 минут; написано за 2 минуты 13 секунд)
   Post subject:
Reply with quote

уже ж ответили, что реально. phpclub.ru/talk/showthread.php?s=&threadid=104877
ждете, чтобы Вам выложили готовый скрипт?
тем более что Вы точно не знаете что и зачем нужно...
Back to top
View user's profile Send private message
satsura
Заглянувший



Joined: 08 Aug 2007
Posts: 14
Карма: 0
   поощрить/наказать

Location: Беларусь

PostPosted: Fri Jan 04, 2008 5:49 pm (спустя 43 минуты; написано за 3 минуты 8 секунд)
   Post subject:
Reply with quote

dimagolov wrote:
уже ж ответили, что реально. phpclub.ru/talk/showthread.php?s=&threadid=104877
ждете, чтобы Вам выложили готовый скрипт?
тем более что Вы точно не знаете что и зачем нужно...
Там ответили только на одну часть вопроса - "Реально ли?". Но не ответили на другую - "Как?"
Я не ожидаю готового скрипта, мне просто интересна теоретическая часть данного вопроса.
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Fri Jan 04, 2008 6:56 pm (спустя 1 час 6 минут; написано за 7 минут 5 секунд)
   Post subject:
Reply with quote

а что, своих мыслей нету как это сделать?
по идее разбить задачу можно так:
1. формировать динамическую ссылку которую отдаем пользователю. если очень злобные буратины, то прописываем ее в сессию и считаем что как сессия умерла, так юзер сам дурак (понятия не имею продаете Вы ссылки или еще как). Защищаться от передачи другу ссылки и SID-а не будем (пока).
2. если скрипт спрашивают ссылку, то проверяем есть ли она в сессии и начинаем блочно читать файл с ftp и отдавать его по http. докачки при этом не будет - всегда будем отдавать с начала. можно в сессию писать "закачка идет" и посылать лесом всех других из той же сессии, если ломяться в то же время. по удачному завершению убиваем ссылку из сессии и все, победа. понятно, что у юзера мог не докачаться последний блок но нас это не волнует особо, пусть получает файл по-новому. если возникает ошибка в процессе отдачи файла, то перед смертью чистим флаг "закачка идет" чтобы юзер мог начать качать с начала.
Back to top
View user's profile Send private message
satsura
Заглянувший



Joined: 08 Aug 2007
Posts: 14
Карма: 0
   поощрить/наказать

Location: Беларусь

PostPosted: Fri Jan 04, 2008 8:01 pm (спустя 1 час 5 минут; написано за 8 минут 30 секунд)
   Post subject:
Reply with quote

dimagolov wrote:
начинаем блочно читать файл с ftp и отдавать его по http.
Больше всего меня интересует этот момент. Просто я не могу понять как это реализовать? Не могли бы дать ссылки где можно прочитать?
Или в крайнем случае самим рассказать как это лучше делать?
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Fri Jan 04, 2008 8:15 pm (спустя 13 минут; написано за 1 минуту)
   Post subject:
Reply with quote

www.php.net/manual/ru/ref.ftp.php, каменты к www.php.net/manual/ru/function.fread.php. то есть читать с диска ничего не будем - с ftp получаем блок и отдаем в поток.
Back to top
View user's profile Send private message
satsura
Заглянувший



Joined: 08 Aug 2007
Posts: 14
Карма: 0
   поощрить/наказать

Location: Беларусь

PostPosted: Fri Jan 04, 2008 8:45 pm (спустя 30 минут; написано за 32 секунды)
   Post subject:
Reply with quote

Огромное вам спасибо за терпение! Разобрался, я так и делал... просто забыл про отправку одного из заголовков!
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Fri Jan 04, 2008 9:00 pm (спустя 15 минут; написано за 2 минуты 14 секунд)
   Post subject:
Reply with quote

есть нюанс. так как сессия будет залочена скриптом закачки, то по идее все запросы с тем же SID будут отваливаться по таймауту не дождавшись доступа к файлу сессии. так что флаг "идет закачка" и лишний.
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Sat Jan 05, 2008 12:10 am (спустя 3 часа 10 минут; написано за 3 секунды)
   Post subject:
Reply with quote

dimagolov, Вам от меня лично ящик Вашего любимого напитка за пост про сессии :)! Кидайте в личку адрес своей почты (если не в Москве живете), или, если Вы москвич, просто напишите свои координаты, я Вам в таком случае этот ящик лично вручу.
Back to top
View user's profile Send private message Send e-mail
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Sat Jan 05, 2008 1:34 am (спустя 1 час 23 минуты; написано за 6 минут 7 секунд)
   Post subject:
Reply with quote

Юрий Насретдинов ээээ... апельсиновый сок отправлять через Атлантику будет много дороже самого сока, так как я на Барбадосе проживаю, как и написано в профиле, это не прикол. Вообще это не особо моя заслуга, тут (phpclub.ru/talk/showthread.php?s=&threadid=105213&rand=13) просто сегодня тема была и Фанат в этой месаге (phpclub.ru/talk/showthread.php?postid=769073#post769073) расказал про это. Я, кстати, тоже прозрел реально, много над чем подумать стоит, у меня тоже запросы якобы паралельно шлются, а на самом деле выходит исполниться они могут один за другим. Надо еще перепроверить, как оно на разных платформах работает и вдумчиво ман почитать. Хотя некий паралелизм налицо - клиент отправляет все подряд, а уже на стадии исполнения php (после получения запроса апачем) скрипт ждет завершения предидущего). Если бы они реально паралельно выполнялись, то могло быть даже медленней, так как больше была бы пиковая нагрузка на сервер в момент запроса, а это как известно дольше, чем последовательно выполнение тех же задач.
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9994
   поощрить/наказать


PostPosted: Sat Jan 12, 2008 3:28 am (спустя 7 дней 1 час 53 минуты; написано за 18 секунд)
   Post subject:
Reply with quote

Модераторы, теме баллов добавьте, пожалуйста.
Back to top
View user's profile Send private message
Iced
Участник форума



Joined: 25 Apr 2007
Posts: 51
Карма: 5
   поощрить/наказать


PostPosted: Fri Jan 18, 2008 11:53 am (спустя 6 дней 8 часов 24 минуты; написано за 8 минут 9 секунд)
   Post subject:
Reply with quote

Кстати, господа программисты, вот возник интересный вопрос по теме! :)

Нужно скачать файл на свой сервер с удалённого, обработать (можно поточно), и выдать пользователю...
Условия:
- файл большеватый, ~20-60 MB;
- php_ini: allow_url_fopen = Off (allow_url_include - не предлагать);
- cURL есть.

Первым делом напрашивается решение через cURL,
НО:
- пока cURL будет скачивать файл к себе, пользователю некоторое, пусть и не продолжительное, время придётся сидеть и смотреть на пустое окно;
- на удалённом сервере никто не предусматривал, что к нему будут присылаться запросы "Range: bytes=<от сих>-<до сих>" :-(

А было бы очень удобно получить функциональность считывания по "кусочкам" fopen('http://...')-while($=fread($, <кусочек>))...
Может есть у кого какие идеи?
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Fri Jan 18, 2008 12:25 pm (спустя 32 минуты; написано за 13 секунд)
   Post subject:
Reply with quote

Iced
Используйте fsockopen, и будет Вам счастье :)
Back to top
View user's profile Send private message Send e-mail
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Fri Jan 25, 2008 7:19 pm (спустя 7 дней 6 часов 54 минуты; написано за 3 минуты 49 секунд)
   Post subject:
Reply with quote

Как идея...
По команде "скачать" запускается еще один скрипт в фоне командами popen, к примеру,
  у юзера активизируется Ajax - служба проверки состояния качалки и основной скрипт завершается.
Фоновый скрипт укачивает понравившийся юзеру файл возможным для скрипта способом (CURL'ом) и периодически вываливает в текстовый файл доклад о собственном прогрессе.
Ajax служба периодически выводит этот доклад о прогрессе юзеру... Все довольны...
Back to top
View user's profile Send private message Send e-mail
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Fri Jan 25, 2008 9:53 pm (спустя 2 часа 34 минуты; написано за 5 минут 42 секунды)
   Post subject:
Reply with quote

Ksnk, то, сколько выкачал php и то, сколько он одлал в stdout совсем не равно тому, что получил пользователь. если у него инет медленный, а буфер у apache большой, то Ajax может отрапартовать про то, что "все пришло" (на самом деле "все ушло из пхп") еще до того (в самом крайнем случае), как у клиента появиться запрос на сохранениение. а если есть еще антивирусы, которые сканят http траф или просто прокси, то вообще в лужу сесть проще простого.
статистику закачки можно показывать только когда напрямую и на сервере и на клиенте сокетами передаешь-получаешь. и отвечать за свою сторону (то есть скрипт, который рулит сокетом может что-то умное сказать о прогрессе на своей стороне). такое в веб-приложениях не реализуемо ИМХО, разве что через кастомный ActiveX
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Fri Jan 25, 2008 10:02 pm (спустя 8 минут; написано за 3 минуты 16 секунд)
   Post subject:
Reply with quote

satsura wrote:
И еще сам файл не должен при вытаскивании с "СХ" сохраняться в промежутке на "СИ".
Oops! Не обратил внимание на это условие... Оно еще актуально?
dimagolov
Iced wrote:
пользователю некоторое, пусть и не продолжительное, время придётся сидеть и смотреть на пустое окно
Я боролся вот с этим эффектом. Сама передача файла клиенту возможна только после полной закачки файла на СИ сервер... а вдруг у клиента канал до СИ толще, чем между СИ и СX? Да и передавать недозалоченный файл как-то не особо корректно будет в моем случае...
Back to top
View user's profile Send private message Send e-mail
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Fri Jan 25, 2008 10:14 pm (спустя 11 минут; написано за 5 минут 20 секунд)
   Post subject:
Reply with quote

Ksnk, Вы вообще про чью задачу: Iced-а или satsura?
Просто ИМХО если нельзя потоково (блочно) закачивать на СИ, то ничего не сростётся. Клиент то запросил файл, заголовки ему надо отдать файла и если за время таймаута броузера отдавать нечего, то ничего не попишешь, game over.
Разве что показать статическое окошко с сообщением "ваш запрос обрабатывается", в это время закачать файл на СИ, потом через Аякс (который со стороны клиента должен проверять закончился процес закачки на СИ с СХ или нет) запросить уже закачку с СИ на СХ. Так можно выкрутиться...
Back to top
View user's profile Send private message
Iced
Участник форума



Joined: 25 Apr 2007
Posts: 51
Карма: 5
   поощрить/наказать


PostPosted: Tue Jan 29, 2008 11:58 am (спустя 3 дня 13 часов 44 минуты; написано за 14 минут 31 секунду)
   Post subject:
Reply with quote

Кстати говоря, возвращаесь к задаче Iced'a... ;-)
Стало интересно, а что будет, если через fsockopen (За что отдельное спасибо Юрию Насретдинову! Мне почему-то казалось, что на fsockopen() накладываются те же ограничения, что и на fopen() в плане запросов по http://, например. Просто всегда пользовался cURL'ом для таких нужд :-)) отправить заголовок "Accept-Encoding: gzip,deflate" (HTTP 1.1) :-) Имеется ввиду я получу результат закоженый zlib'ом или это для программиста будет прозрачно :-) Как оказалось "распаковывать" результат нужно самому, что впринципе мне кажется очень логичным :-) Но в процессе возник ещё один интересный вопрос!
Если я запрашиваю что-нить проходящее через mod_php, например
GET /index.php HTTP/1.1
Host: <такой-то>
Accept-Encoding: gzip,deflate
то получаю упакованый ответ
Надо отметить, что для этого ещё был настроен соответствующе .htaccess:
php_flag zlib.output_compression On
php_value zlib.output_compression_level 9 (от души, что называется ;-))
НО!
Если я запрашиваю какой-нить файлик у apache'а, без участия PHP, например:
GET /my.css HTTP/1.1
Host: <такой-то>
Accept-Encoding: gzip,deflate
то сервер не упаковывает свой ответ мне... Пробывал на Apache/1.3.34 и на Apache/2.2.3 со включенным mod_deflate. Полный ответ и всё... Есть какая-то настройка отвечающая за это? Не то чтобы уж жизненно необходимо, но интересно знать! :-) Может кто тоже экспериментировал с этим?
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Tue Jan 29, 2008 3:53 pm (спустя 3 часа 54 минуты; написано за 43 секунды)
   Post subject:
Reply with quote

Iced, читаем httpd.apache.org/docs/2.2/mod/mod_deflate.html, он сеет разумное, доброе, вечное :)
Back to top
View user's profile Send private message
LEVsu
Участник форума



Joined: 05 Jun 2008
Posts: 22
Карма: -1
   поощрить/наказать


PostPosted: Fri Jun 06, 2008 12:17 am (спустя 4 месяца 7 дней 8 часов 24 минуты; написано за 2 секунды)
   Post subject:
Reply with quote

>Используйте fsockopen, и будет Вам счастье :)
Кстати, у меня функция $fp=fsockopen($server,80,&$errno,&$errstr); не работает, не на денвере, не на хостинге.
Server test1.ru/ee.htm. Connection failed: 0, Unable to find the socket transport "http" - did you forget to enable it when you configured PHP? Ее надо как то настраивать в конфиге? На хостинге дается виртуальный сервер, поэтому можно покопаться в конфигах. Не подскажете, что именно надо изменить чтобы эта функция соединялась с сервером по http?
Back to top
View user's profile Send private message Send e-mail
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Fri Jun 06, 2008 12:56 am (спустя 39 минут; написано за 2 минуты 4 секунды)
   Post subject:
Reply with quote

Levsu, почитайте внимательно документацию по
Code (php): скопировать код в буфер обмена
fsockopen (www.php.net/fsockopen)();
, и Вы поймете, что http в $server совершенно линшее, потому что fsockopen работает на транспортном уровне (tcp, udp) и http тут не в тему.
Back to top
View user's profile Send private message
LEVsu
Участник форума



Joined: 05 Jun 2008
Posts: 22
Карма: -1
   поощрить/наказать


PostPosted: Tue Nov 11, 2008 4:25 pm (спустя 5 месяцев 5 дней 15 часов 28 минут; написано за 1 минуту 23 секунды)
   Post subject:
Reply with quote

Спасибо я разобрался и написал на ее основе скачивалку файлов любого размера
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 386
   поощрить/наказать


PostPosted: Wed Dec 10, 2008 10:29 pm (спустя 29 дней 6 часов 4 минуты; написано за 5 секунд)
   Post subject:
Reply with quote

readfile
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Mon May 04, 2009 11:46 pm (спустя 4 месяца 25 дней 1 час 16 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Я не слышал про register_globals»,
расположенную в форуме Лень сходить в Поиск или почитать документацию (05 Мая 2009, 00:46).
Back to top
View user's profile Send private message Send e-mail
satmasterz
Заглянувший



Joined: 30 Oct 2013
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Wed Oct 30, 2013 10:01 pm (спустя 4 года 5 месяцев 25 дней 22 часа 15 минут; написано за 11 секунд)
   Post subject:
Reply with quote

Спасибо за ответ!
--------------
fitoterapevt.pp.ua/likarski-roslini/xvoshh-polovij-sosonka-vlastivosti-zastosuvannya-recepti
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
База квартир в столице. Коттеджные поселки на Каширке рядом со столицей. . ищу спонсора для встреч.
XML