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

Передача значений массива $_POST с помощью cURL

Web

Как использовать array_filter() для фильтрации ключей массива в PHP

Web

Как вставить новый элемент в массив в любую позицию на PHP

Web

Синтаксическая ошибка, неожиданный конец файла в PHP-коде