Intereting Posts
Резервное копирование базы данных mysql с живого сервера на мой локальный MySQL Миграция Laravel: уникальный ключ слишком длинный, даже если указан Я не могу использовать GET и POST одновременно в PHP Codeigniter + GoCart CMS + Dreamhost (Shared Hosting) говорит: «Невозможно найти указанную модель …» POST-данные от iOS до php-сервера всегда NULL – iOS 10, Swift 3, php Пользовательские заголовки PHP cURL В PHP, почему я могу получить доступ к нестационарному методу статическим способом? Parsley ajax отправляет переменные сообщения Как определить, загрузил ли пользователь файл больше, чем post_max_size? Почему моя база данных не обновляется, когда кто-то посещает мой сайт? Именованный захват в PHP с использованием регулярного выражения Как загрузить gif-образ при загрузке содержимого ajax и javascript Как использовать Ajax с jQuery в Laravel 4? Что значит «сделать вид»? Что это за процедура? php генерирует случайное изображение из каталога

Принуждение загрузить файл с помощью PHP

У меня есть файл 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 файл, который создает новый файл.

Related of "Принуждение загрузить файл с помощью PHP"

.htaccess Решение

Чтобы перегружать все загружаемые csv на вашем сервере, добавьте в свой файл .htaccess:

 AddType application/octet-stream csv 

Решение PHP

 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; } ?>