Как скриптом отдать AVI файл с FTP сервера?

Bboy

Новичок
Как скриптом отдать AVI файл с чужого FTP сервера?

Долго рылся в поиске, перепробовал массу вариантов, но не один не подошел, может потому что мне надо с скачать с ftp, а не через http(что в основном везде и обсуждатеся), а может потому что руки кривые, за что заранее прошу прощения...:)

В общем надо что бы при выполнении скрипта появлялась бы табличка: открыть, сохранить, отменить...

Например такой вариант:

<?php
$filename="ftp://ftp.ext.ru/incoming/clock.avi";
$file_name="clock.avi";
header("Cache-control: private");
header ("Content-type: octet/stream");
header("Content-Length: ".filesize($filename));
header("Content-Disposition: filename=".$file_name);
readfile($filename);
?>

Выводит след. ошибки:
Warning: filesize() [function.filesize]: Stat failed for ftp://ftp.ext.ru/incoming/clock.avi (errno=2 - No such file or directory) in z:\home\localhost\www\q.php on line 6 - Хотя файл такой есть!

Warning: Cannot modify header information - headers already sent by (output started at z:\home\localhost\www\q.php:6) in z:\home\localhost\www\q.php on line 6

Warning: Cannot modify header information - headers already sent by (output started at z:\home\localhost\www\q.php:6) in z:\home\localhost\www\q.php on line 7

А после ошибок примерно такую фигню много много:
 0  1  i f  2  3  f c  5  6  c a  8  9  a _  ;  <  _ ]  =  >  ] [  ?  @  [ Y  …  Y W  ‰  W U  Ќ  U S  ‘  S Q  •  Q P  ™  P N  ›  N L  ›  L K    ™    K I    ™    I G    —    G F   –   F E   •   E C    ”   C B    ’    B A    ’    A ?    ђ    ? >    ђ    > =    Ћ    = ;    Ћ    ; :  Е  : 9  Й  9 8  Л  8 7  Н  7 6  П  6 5  С  5 3  У  3 2  Х  2 1  Щ  1 0  Ы  0 /  Э  / .  Я  . -  б  - ,  г  , ,  е  , +  з  + *  з  * )  й  ) (  л  ( '  н  ' &  п  & %  с  % $  у  $ $  х  $ #  ч  # "  ч  " !  щ  ! !  ы  !  э    э     я     я      я      я      я      я      я      я     я     я     я    


Посоветуйте, пожалуйста, что исправить?

-~{}~ 13.05.04 22:25:

О! Вроде бы помогла след. конструкция:
<?php
$dir="ftp://ftp.ext.ru/incoming/";
$fn='clock.avi';
header("Content-Disposition: attachment; filename=$fn");
readfile($dir.$fn);
?>

Но почему-то предлагает скачать не clock.avi, а имя_скрипта.php. После скачивания появляется clock.avi, к-ый работает нормально.
 

SiMM

Новичок
Re: Как скриптом отдать AVI файл с FTP сервера?

Автор оригинала: Bboy
PHP:
header("Content-Length: ".filesize($filename));
Выдержка из мануала:
Замечание: функция [m]filesize[/m] не применима для работы с удаленными файлами, поскольку файл должен быть доступен через файловую систему сервера.
А просто не указывать длину - пробовал? У меня срабатывало.
А вообще - зачем качать с "чужого" ftp скриптом (разве что у него ограничение анонимного доступа или не хотелось бы светить явки/пароли)? Если предполагается многократная скачка - то не лучше ли будет кэшировать данные у себя?
Но почему-то предлагает скачать не clock.avi, а имя_скрипта.php. После скачивания появляется clock.avi, к-ый работает нормально.
В каком браузере?
 

Фанат

oncle terrible
Команда форума
исправь заголовок
Как скриптом отдать AVI файл с ЧУЖОГО FTP сервера?
 

Bboy

Новичок
Re: Re: Как скриптом отдать AVI файл с FTP сервера?

Originally posted by SiMM
Выдержка из мануала:
Вот спасибо, вот оказывается в чем было дело!:)

В каком браузере? [/QUOTE]
IE - 6

-~{}~ 14.05.04 06:47:

Ну дак что, нет идей почему предлагает сохранять имя_скрипта.php, а не имя_avi_файла.avi?
 

Crazy

Developer
Re: Re: Re: Как скриптом отдать AVI файл с FTP сервера?

Автор оригинала: Bboy
Ну дак что, нет идей почему предлагает сохранять имя_скрипта.php, а не имя_avi_файла.avi?
А с чего бы ему предлагать сохранять как AVI? Читаем сообщение: "Warning: Cannot modify header information - headers already sent".
 

Bboy

Новичок
Re: Re: Re: Re: Как скриптом отдать AVI файл с FTP сервера?

Originally posted by Crazy
А с чего бы ему предлагать сохранять как AVI? Читаем сообщение: "Warning: Cannot modify header information - headers already sent".
Если ты про первое сообщение, то там пониже я привел такую вот конструкцию:
<?php
$dir="ftp://ftp.ext.ru/incoming/";
$fn='clock.avi';
header("Content-Disposition: attachment; filename=$fn");
readfile($dir.$fn);
?>

Которая работает без ошибок! Только вот предлагает сохранить файл с именем скрипта, а не нужного avi файла. Почему???
 

Bboy

Новичок
Originally posted by Crazy
Bboy, hint: ты отдаешь "content-type: text/html".
Блин, а что надо?
Пробовал
header ("Content-type: octet/stream");
header("Content-Type: application/octet-stream");
header("Content-type: application/force-download");
Не помогает((

Crazy, помоги, пожалуйста:(

-~{}~ 20.05.04 20:19:

Блин, ребята, неужели никто не знает решения данной проблемы:confused: :confused: :confused:
 

Crazy

Developer
Мне -- помогло.

Код:
<?php

$fn='clock.avi';
header("Content-type: application/foobar");
header("Content-Disposition: attachment; filename=$fn");

......

?>
 

Bboy

Новичок
А мне нет:( :( :( Все равно предлагает скачать имя_скрипта.php, а не имя avi фа-ла:(((
 

neko

tеam neko
1. читаем
php.net/header

2. делаем как написано
3. все работает
 

Bboy

Новичок
а может дело в том что я с ftp, а не с http пытаюсь скачать?
 

SiMM

Новичок
Bboy, а какая разница клиенту, откуда ему скрипт отдаёт данные - из памяти, с диска, http или ftp? Другое дело, браузер может игнорировать filename из HTTP-заголовка или вообще его не получать.
 

Mephistophel

Новичок
Експлорер просто хочет себе немного другие заголовки, чтобы правильно тображать информацию при скачке. Попробуй послать что-то типа вот этого:
PHP:
header('Pragma: public');
header('Content-Type: application/octetstream');
header('Content-Disposition: attachment; filename=' . $realname);
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Accept-Ranges: bytes");
header('Content-Length: ' . $filesize);
 

SiMM

Новичок
Mephistophel, Accept-Ranges, если не ошибаюсь, не надо, если он не поддерживает в скрипте многопоточной закачки, а Content-Length ему просто неизвестен.
 

Mephistophel

Новичок
Originally posted by SiMM
Mephistophel, Accept-Ranges, если не ошибаюсь, не надо, если он не поддерживает в скрипте многопоточной закачки, а Content-Length ему просто неизвестен.
Насчет Accept-Ranges это да, Content-Lenght при желании можно узнать, если фтпшник отдаст.
А вообще, я как-то сам сталкивался с проблемой корректного отображения информации о файле, когда я сам его отдаю експлореру, вот я просто из своего скрипта хедеры и скопировал :)

Но ключик к эксплореру лежит вообще-то вот тут:
PHP:
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
Остальные браузеры такие заголовки, по-моему, просто игнорируют.
 

Lucky

Новичок
Может так?
$fsize=filesize($full_name);
Header("Content-Disposition: attachment; filename=".$name);
Header("Content-Description: ".$name);
Header("Content-Transfer-Encoding: binary");
Header("Content-Length: ".$fsize);
Header("Pragma: no-cache");
Header("Connection: close");
Header("Content-Type: application/octet-stream");
$fh=fopen($full_name,'rb');
fpassthru($fh);
 

SiMM

Новичок
Автор оригинала: Mephistophel
Но ключик к эксплореру лежит вообще-то вот тут:
PHP:
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
Вообще-то, имхо, это ключик от кэширования, а не от описанной выше задачи.
 
Сверху