У меня есть файл CSV
на моем сервере, если пользователь нажимает ссылку, которую он должен загрузить, но вместо этого он открывается в моем окне браузера.
Мой код выглядит следующим образом
<a href="files/csv/example/example.csv"> Click here to download an example of the "CSV" file </a>
Это обычный веб-сервер веб-сервера, на котором я работаю над всеми моими девайсами.
Я попробовал
<a href="files/csv/example/csv.php"> Click here to download an example of the "CSV" file </a>
Теперь содержимое моего файла csv.php
:
header('Content-Type: application/csv'); header('Content-Disposition: attachment; filename=example.csv'); header('Pragma: no-cache');
Теперь моя проблема в том, что это загрузка, но не мой CSV
файл, который создает новый файл.
Чтобы перегружать все загружаемые csv на вашем сервере, добавьте в свой файл .htaccess:
AddType application/octet-stream csv
header('Content-Type: application/csv'); header('Content-Disposition: attachment; filename=example.csv'); header('Pragma: no-cache'); readfile("/path/to/yourfile.csv");
Или вы можете сделать это с помощью html5. Просто с
<a href="example.csv" download>download not open it</a>
Это нельзя сделать надежно, так как браузер должен решить, что делать с URL-адресом, который был запрошен для извлечения.
Вы можете предложить браузеру, что он должен немедленно предложить «сохранить на диск», отправив заголовок Content-disposition:
header("Content-disposition: attachment");
Я не уверен, насколько это поддерживается различными браузерами. Альтернативой является отправка Content-типа приложения / октетного потока, но это взлом (вы в основном говорите в браузере «Я не говорю вам, что это за файл», и в зависимости от того, что большинство браузеры затем предложит диалог загрузки) и предположительно вызывает проблемы с Internet Explorer.
Подробнее об этом читайте в разделе « Часто задаваемые вопросы о веб-разработке».
Редактирование. Вы уже переключились на файл PHP для доставки данных, что необходимо для установки заголовка Content-disposition (если не установлены какие-то тайные настройки Apache, которые также могут это сделать). Теперь все, что осталось сделать, – это то, что этот файл PHP читает содержимое файла CSV и печатает их – filename=example.csv
в заголовке только указывает браузеру клиента, какое имя использовать для файла, на самом деле это не извлечение данных из файла на сервере.
Вот более безопасное для браузера решение:
$fp = @fopen($yourfile, 'rb'); if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { header('Content-Type: "application/octet-stream"'); header('Content-Disposition: attachment; filename="yourname.file"'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header("Content-Transfer-Encoding: binary"); header('Pragma: public'); header("Content-Length: ".filesize($yourfile)); } else { header('Content-Type: "application/octet-stream"'); header('Content-Disposition: attachment; filename="yourname.file"'); header("Content-Transfer-Encoding: binary"); header('Expires: 0'); header('Pragma: no-cache'); header("Content-Length: ".filesize($yourfile)); } fpassthru($fp); fclose($fp);
Настройте свой сервер для отправки файла с помощью application/octet-stream
типа носителя application/octet-stream
.
Это означает, что ваш браузер может обрабатывать этот тип файла.
Если вам это не нравится, самым простым методом будут предлагать zip-файлы. Каждый может обрабатывать zip-файлы, и они загружаются по умолчанию.
Хорошее чистое решение.
<?php header('Content-Type: application/download'); header('Content-Disposition: attachment; filename="example.csv"'); header("Content-Length: " . filesize("example.csv")); $fp = fopen("example.csv", "r"); fpassthru($fp); fclose($fp); ?>
Предыдущий ответ на этой странице описывает, как использовать .htaccess, чтобы принудительно загрузить все файлы определенного типа. Однако решение не работает со всеми типами файлов во всех браузерах. Это более надежный способ:
<FilesMatch "\.(?i:csv)$"> ForceType application/octet-stream Header set Content-Disposition attachment </FilesMatch>
Возможно, вам понадобится очистить кеш браузера, чтобы убедиться, что это работает правильно.
Если вы делаете это с самим аппликацией .. Надеюсь, что этот код поможет.
HTML
В href – вы должны добавить download_file.php вместе с вашим URL-адресом
<a class="download" href="'/download_file.php?fileSource='+http://www.google.com/logo_small.png" target="_blank" title="YourTitle">
Php
/ * Вот файл Download.php для принудительной загрузки файлов * /
<?php $fullPath = $_GET['fileSource']; if($fullPath) { $fsize = filesize($fullPath); $path_parts = pathinfo($fullPath); $ext = strtolower($path_parts["extension"]); switch ($ext) { case "pdf": header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download header("Content-type: application/pdf"); // add here more headers for diff. extensions break; default; header("Content-type: application/octet-stream"); header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); } if($fsize) {//checking if file size exist header("Content-length: $fsize"); } readfile($fullPath); exit; } ?>