С помощью приглашения браузера загрузить файл

У меня есть сайт php/mysql, в котором я пытаюсь загрузить файл с разделителями-запятыми (CSV). Создаваемый файл csv содержит данные с разделителями-запятыми (имя, адрес, город, штат). Я создаю файл csv ok и поместил его в каталог сайта/загрузки. Все идет нормально. Я просматриваю строку и код, чтобы вызвать подсказку загрузки браузера, которую я вижу чаще всего:

$path = $_SERVER['DOCUMENT_ROOT'];
$exportfile = "emailclientaddresses.csv";
$fullpath = "downloads/" . $exportfile;
header("Content-type: text/plain");
header("Content-Length: ".filesize($exportfile));
header("Content-Disposition: attachment; filename=" . $fullpath);

Файл экспорта $- это файл csv, созданный моим кодом. Все в порядке. Что это делает:

  • $fullpath отображается в приглашении загрузки браузера в очень странном формате: download_emailclientaddresses.csv
  • Когда он загружается, загружается текущая веб-страница или комбинация файла csv и текущей веб-страницы.

Хорошо, я много пробовал, и ничего не получилось. Поэтому, если кто-нибудь может мне помочь, я был бы признателен. Спасибо.

ed Cohen

Ответ 1

документация по PHP дает хороший пример:

<?php
$file = 'monkey.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>

EDIT (ответ на комментарий, объяснение)

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

Не отображать в браузере, а передавать файл.

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

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

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

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

header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');

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

header('Content-Length: ' . filesize($file));

Отправьте правильный размер файла в браузер,
иначе браузер не сможет оценить время передачи.

ob_clean();
flush();

Перед загрузкой убедитесь, что заголовки отправлены в браузер.

readfile($file);

Отправьте файл в браузер.

exit;

Готово:)