Web

Принудительная загрузка файла на php с помощью header()

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

<?php

$size = filesize("Image.png");

header('Content-Description: File Transfer');

header('Content-Type: image/png');

header('Content-Disposition: attachment; filename="Image.png"');

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: ' . $size);

readfile("Image.png");

 Я даже попытался использовать самый простой пример, который смог найти, например, такой:

<?php

header('Content-type: image/png');

header('Content-Disposition: attachment; filename="Image.png"');

readfile('Image.png');

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

'Content-Disposition: attachment; filename="Image.png"'

 Но диалог сохранения не отображается. Я также пробовал использовать inline вместо attachment в заголовке расположения содержимого, но это тоже не дало результата. Я тестировал это в Firefox 8.0.1, Chrome 15.0.874.121 и Safari 5.1.1.

 

Ответ 1

Я уверен, что вы не добавляете тип mime как JPEG при загрузке файлов:

header('Content-Type: image/png');

 Эти заголовки никогда не подводили меня:

$quoted = sprintf('"%s"', addcslashes(basename($file), '"\\'));

$size   = filesize($file);

header('Content-Description: File Transfer');

header('Content-Type: application/octet-stream');

header('Content-Disposition: attachment; filename=' . $quoted); 

header('Content-Transfer-Encoding: binary');

header('Connection: Keep-Alive');

header('Expires: 0');

header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

header('Pragma: public');

header('Content-Length: ' . $size);

 

 Ответ 2

Это сработало для меня в процессе загрузки PNG и PDF:

header('Content-Description: File Transfer');

header('Content-Type: application/octet-stream');

header('Content-Disposition: attachment; filename="'.$file_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($file_url)); //Absolute URL

ob_clean();

flush();

readfile($file_url); //Absolute URL

exit();

 

Ответ 3

Этот код работает у меня:

$attachment_location = "filePath";

if (file_exists($attachment_location)) {

    header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");

    header("Cache-Control: public"); // needed for internet explorer

    header("Content-Type: application/zip");

    header("Content-Transfer-Encoding: Binary");

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

    header("Content-Disposition: attachment; filename=filePath");

    readfile($attachment_location);

    die();

} else {

    die("Ошибка – файл не найден!");

}

 

Ответ 4

Вот фрагмент, который я тестировал... очевидно, что передача через get в скрипт может быть не самой лучшей... следует отправить сообщение или просто послать id и взять guid из базы данных... так или иначе... это сработало. Я беру URL и конвертирую его в путь.

// Инициализируем URL файла в переменную

$file = $_GET['url'];

$file = str_replace(Polepluginforrvms_Plugin::$install_url, $DOC_ROOT.'/pole-permitter/', $file );

$quoted = sprintf('"%s"', addcslashes(basename($file), '"\\'));

$size   = filesize($file);

header( "Content-type: application/octet-stream" );

header( "Content-Disposition: attachment; filename={$quoted}" );

header( "Content-length: " . $size );

header( "Pragma: no-cache" );

header( "Expires: 0" );

readfile( "{$file}" );

 

Схожие статьи

Web

Как проверить, является ли массив PHP ассоциативным или последовательным

Web

Что такое ISA Server. ISA Server простыми словами. Настройка ISA

Web

Как использовать PHPMailer для массовой рассылки писем

Элементы веб-страницы: как использовать программу webcomponents
Web

Элементы веб-страницы: как использовать программу webcomponents