Использование заголовка в качестве ссылки для загрузки в PHP

Поэтому у меня есть эта проблема с моей ссылкой для скачивания. В принципе, мой предыдущий способ создания ссылки для загрузки состоит в том, чтобы просто создать кнопку формы с методом = 'link', а действие – ссылку на файл. Это работает для firefox и других, но не для сафари. По какой-то причине, когда пользователь пытается загрузить файл (файл excel) из сафари, он просто отобразит кучу символов ascii в браузере (думаю, он пытается его прочитать с помощью браузера?). Ну, я искал другое решение, и похоже, что использование заголовка – это способ сделать это. Итак, теперь я пытаюсь создать кнопку формы с методом = 'post' и action = 'download.php', где есть скрытое поле со ссылкой на файл. Похоже, это

function showDownloadWithHeader($link){ echo "<form action='download.php' method='post' >"; echo "<input class='downloadButton' type='submit' value='Download Report'>"; echo "<input type='hidden' name='filename' value='$link'>"; echo "</form>"; } 

И внутри download.php я просто хочу, чтобы пользователь попросил загрузить файл.

 <?php if($_POST['filename'] == '' || empty($_POST['filename'])){ exit; } $filename = $_POST['filename']; //the file is 2 folder down. eg data/stack/bla.xlsx $file = $filename; $extension = end(explode('.', $filename)); error_reporting(E_ALL); ini_set("display_errors",1); // echo $filename; // echo "<br/>"; // echo $extension; // echo filesize($filename); // echo "<br/>"; switch($extension){ case 'xls': $mimeType = 'application/vnd.ms-excel'; break; case 'xlsx': $mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; break; } // echo $mimeType; header('Content-Description: File Transfer'); header('Content-Type: ' . $mimeType); header('Content-Disposition: attachment; filename='.basename($file)); 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)); ob_clean();    flush(); readfile($filename); exit; ?> 

Я видел это решение на php.net в функции readfile (), но он, похоже, не работает для меня. Я делаю это на localhost.

Что-то вроде этого отлично работает.

 header("Pragma: public", true); header("Expires: 0"); // set expiration time header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header("Content-Disposition: attachment; filename=".basename($file)); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".filesize($file)); die(file_get_contents($file)); 

Если я правильно понимаю вас, скрипт работает так, как ожидалось, т.е. если браузер распознает тип mime:

 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 

Затем он ПОКАЗЫВАЕТ его в браузере (независимо от того, правильно ли он отображается или что-то еще)

Так как вы хотите FORCE, чтобы скачать INSTEAD OF, показывающий в браузере, используйте тип mime:

 'application/octet-stream' 

Это должно работать во всех браузерах и принудительно загружать вместо отображения в браузере.