Ошибка в настройке заголовка в PHP - PullRequest
0 голосов
/ 27 октября 2011

ниже - часть кода в моем шлюзе загрузки

if (!isset($_GET['f']) || empty($_GET['f'])) {die("<h1>URL Malfunction</h1><br/><p><i>Please Try Later</i>");}
if (strpos($_GET['f'], "\0") !== FALSE){ die("<h1>URL Malfunction</h1><br/><p><i>Please Try Later</i>");}
                            #Check URL, find resource Path

$fileName = basename($_GET['f']);
$file_path=(string)makeDownloadFilePath($fileName,"dir");

if(!is_file($file_path)){die("<h1>404 Not found</h1><br/><p><i>The resource you requested is not available</i>");}

$fileSize = filesize($file_path); 



header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");                    #Build Response#
header("Content-Description: File Transfer");
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"$fileName\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fileSize);


$file = @fopen($file_path,"rb");
if ($file) {
  while(!feof($file)) {                 #File Transfer#
   print(fread($file, 1024*8));
   flush();
   if (connection_status()!=0) {
    @fclose($file);
    die();
         }
    }
 @fclose($file);

//The File is Downloaded . Closing Connections

Я использую метод GET для получения имени файла. Имя файла и его путь будут генерироваться из шлюза. Теперь проблема в том, что, когда я нажимаю на кнопку «Загрузить» на странице, вместо отображения диалогового окна «Загрузка» браузер просто отображает содержимое файла в виде текста на экране. Например, я загружаю foo.mp3. двоичное содержимое отображается в виде странного текста на экране. Это повторяет предупреждение типа: мы не можем изменить заголовки. заголовки уже отправлены ...

Может кто-нибудь сказать, где я допустил ошибку?

Спасибо

Ответы [ 5 ]

1 голос
/ 27 октября 2011

Самая распространенная причина этой ошибки в долгом и долгом пути заключается в том, что у вас есть начальный пробел перед открывающим тегом <?php в вашем файле (или одним из включенных в него).

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

1 голос
/ 27 октября 2011

Мы не можем изменить заголовки.Заголовки уже отправлены ..

Эта ошибка возникает, когда вы печатаете что-либо перед php вашей командой заголовка.

0 голосов
/ 27 октября 2011

Спасибо всем за помощь. Проблема была в том, что я использовал

error_reporting(E_ALL);
ini_set('display_errors', true);
flush();

для отладки в одном из моих включений.

Я только что удалил его. Теперь это работает.

0 голосов
/ 27 октября 2011

Вы используете выходной буфер?

попробуйте добавить ob_start(); перед отправкой информации заголовка, это может решить вашу проблему.

Подробнее об этом можно узнать здесь

0 голосов
/ 27 октября 2011

Используйте readfile вместо fopen следующим образом и используйте ob_clean (), ob_flush ():

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.$Name.'"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '.filesize($musicPath));
    ob_clean();
    flush();
    readfile($musicPath);
    ob_flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...