Принудительная загрузка в php [закрыто]


Я пытаюсь создать страницу принудительной загрузки, чтобы браузеры не открывали файлы, которые следует загрузить. Проблема в том, что загруженный файл имеет 0 байт и, следовательно, непригоден для использования. Что не так с моим кодом?

$file = "http://gh0stsec.zxq.net/background1.jpg";
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=".basename($file));
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
header("Content-Description: File Transfer");
@readfile($file);
exit();
Author: Franz Payer, 2012-02-19

2 answers

Проверка:

header("Content-Length: ".filesize($filename));

Я думаю, что это должно быть:

header("Content-Length: ".filesize($file));
 3
Author: Gabriel Sosa, 2012-02-19 15:04:13

Я думаю, что у вас возникнет проблема с filesize, так как это не локальный файл (если это так, используйте относительный путь). Content-Type заголовки всегда немного странные для меня, но во всех примерах, которые я читал, force-download всегда был запасным вариантом. В любом случае, я сделал это, и, похоже, это сработало:

<?php
$file = file_get_contents('http://gh0stsec.zxq.net/background1.jpg');

if ($file) 
{

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=background1.jpg');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . strlen($file));
    ob_clean();
    flush();

    echo $file;
} 
else   
{
    echo 'error';
}
?>
 1
Author: Steve, 2012-02-19 15:22:13