Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Скачивание файла пользователем
Форумы портала PHP.SU » PHP » Программирование на PHP » Скачивание файла пользователем

Страниц (1): [1]
 

1. Хозяин Огня - 19 Октября, 2010 - 10:04:39 - перейти к сообщению
Есть код, отдающий юзеру файл:

PHP:
скопировать код в буфер обмена
  1. if($GET['rem'] == 'dwnl')
  2. {
  3.     $file = IRB_ROOT .'skins/files/25.jpg';
  4.     $fsize = filesize($file);
  5.     $ftime = date("D,d M Y H:i:s T", filemtime($file));
  6.     $f = fopen($file, "rb");
  7.     header('Content-Disposition: attachment; filename="1.jpg"');
  8.     header('Accept-Ranges: bytes');
  9.     header('Content-Transfer-Encoding: binary');
  10.     header("Last-Modified: $ftime");
  11.     header('Pragma: no-cache' );
  12.     header('Content-Description: File Transfer' );
  13.     header('Content-Type: application/octet-stream');
  14.     header("content-length: $fsize");
  15.     fpassthru($f);
  16.    
  17.    
  18.     header($_SERVER["SERVER_PROTOCOL"] . ' 200 OK');
  19.     fclose($f);
  20.  
  21. }


Честно говоря, не понимаю предназначения большинства из этих заголовков, но файл отдаётся. Проблема в том, что содержимое файла теряется. Скажем, если я скачиваю текстовый файл, то в нём оказывается нтмл-код, а не нужный текст, если изображение - то просмотр становится недоступным.
Подскажите пожалуйста, в чём ошибка.
2. Stas.progger - 19 Октября, 2010 - 10:09:41 - перейти к сообщению
Тип передаваемого содержимого, исходя из предоставленного кода, одинаковый для всех файлов.

PHP:
скопировать код в буфер обмена
  1. header('Content-Type: application/octet-stream');


Необходимо определять mime тип файла, и подставлять в данный заголовок перед отдачей пользователю.

Must read
3. Хозяин Огня - 19 Октября, 2010 - 10:47:52 - перейти к сообщению
Stas.progger, нельзя ли поподробнее, пожалуйста.
Копался в нете, во всех примерах этой строчкой всё ограничиватся.
4. Stas.progger - 19 Октября, 2010 - 10:59:18 - перейти к сообщению
Хозяин Огня пишет:
нельзя ли поподробнее, пожалуйста.
Копался в нете, во всех примерах этой строчкой всё ограничиватся.


http://www.php[dot]net/manual/en/fun[dot][dot][dot]header.php#48538
5. Хозяин Огня - 19 Октября, 2010 - 11:12:39 - перейти к сообщению
Инглиш...(

Ну даже если так:

header('Content-Type: application/jpg');

или там

header('Content-Type: application/img');

содержимое всё-равно не доступно...
6. JustUserR - 19 Октября, 2010 - 11:13:36 - перейти к сообщению
Stas.progger пишет:
Тип передаваемого содержимого, исходя из предоставленного кода, одинаковый для всех файлов.
При использовании механизма передачи файла пользователю с помощью специального формата HTTP-документа ответа - включающего в себя заголовок Content-disposition значение передаваемого MIME-пути в общем случае не имеет значения и может быть произвольным - дело в том что указанная схема передачи указывает браузеру клиента на необходимость загрузки файла без его локальной обработки - в то время как дальнейшие операции по запуску файлу определяются системой ассоциаций ОС по расширению файла или другим локальным критериям
7. Хозяин Огня - 20 Октября, 2010 - 14:13:04 - перейти к сообщению
JustUserR пишет:
При использовании механизма передачи файла пользователю с помощью специального формата HTTP-документа ответа - включающего в себя заголовок Content-disposition значение передаваемого MIME-пути в общем случае не имеет значения и может быть произвольным - дело в том что указанная схема передачи указывает браузеру клиента на необходимость загрузки файла без его локальной обработки - в то время как дальнейшие операц


А в чём конкретно ошибка, можно узнать?
8. DeepVarvar - 20 Октября, 2010 - 21:03:03 - перейти к сообщению
Блин, ёхарный бабай:
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET['download'])) {
  2.         $file = '/path/do/filename.txt'; // или любое др расширение
  3.         $filename = 'имя которое увидит юзер.txt'; // расширение тут обязательно
  4.         header ('Content-Type: application/octet-stream');
  5.         header ('Accept-Ranges: bytes');
  6.         header ('Content-Length: '.filesize($file));
  7.         header ('Content-Disposition: attachment; filename='.$filename);
  8.         readfile($file);
  9.         exit();
  10.         }
9. JustUserR - 21 Октября, 2010 - 07:42:52 - перейти к сообщению
Хозяин Огня пишет:
А в чём конкретно ошибка, можно узнать?
Причиной возникновения ошибки в вашем случае могут является различные факторы связанные с неправильной генерацией целевых пользовательских HTTP-заголовков - в частности необходимо проверить правильность относительного пути к целевому файлу и наличие необходимых привелегий для его открытия и получения служебной информация - которая впоследствии используется в вашем PHP-скрипте для генерации заголовков с временем последнего изменение и размером файла
Кроме того причиной появления лишних данных в выводимом пользователю документе является наличия последнего выражения с функцией header в вашем PHP-скрипте - дело в том что в силу отсутствия буферизации и NPH-режима его содержимое не будет использовать с целевывм назначением - в то время как просмотр изображения может быть блокирован из-за несанкционированного изменения его внутреннего представления

 

Powered by ExBB FM 1.0 RC1