在本教程中,您將學習如何使用PHP強制下載文件。
通常,您不一定需要使用任何服務器端腳本語言(例如PHP)來下載圖像,zip文件,pdf文檔,exe文件等。如果此類文件存儲在公共可訪問的文件夾中,則只需創(chuàng)建一個指向該文件的超鏈接,每當用戶單擊鏈接時,瀏覽器都會自動下載該文件。
<a href="downloads/test.zip">下載Zip文件</a> <a href="downloads/masters.pdf">下載PDF文件</a> <a href="downloads/sample.jpg">下載圖像文件</a> <a href="downloads/setup.exe">下載EXE文件</a>
單擊指向PDF或圖像文件的鏈接不會導致其直接下載到硬盤驅(qū)動器。它將僅在瀏覽器中打開文件。此外,您可以將其保存到硬盤中。但是,默認情況下,zip和exe文件會自動下載到硬盤驅(qū)動器。
您可以使用PHP readfile()函數(shù)強制將圖像或其他類型的文件直接下載到用戶的硬盤上。在這里,我們將創(chuàng)建一個簡單的圖像庫,允許用戶單擊鼠標從瀏覽器下載圖像文件。
讓我們創(chuàng)建一個名為“ image-gallery.php”的文件,并將以下代碼放入其中。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Simple Image Gallery</title> <style type="text/css"> .img-box{ display: inline-block; text-align: center; margin: 0 15px; } </style> </head> <?php //包含示例圖像文件名的數(shù)組 $images = array("kites.jpg", "balloons.jpg"); //遍歷數(shù)組以創(chuàng)建圖片庫 foreach($images as $image){ echo '<div class="img-box">'; echo '<img src="images/' . $image . '" width="200" alt="' . pathinfo($image, PATHINFO_FILENAME) .'">'; echo '<p><a href="download.html?file=' . urlencode($image) . '">下載</a></p>'; echo '</div>'; } ?> </html>
如果仔細查看上面的示例代碼,則會發(fā)現(xiàn)指向“ download.php”文件的下載鏈接點,該URL還包含圖像文件名作為查詢字符串。另外,我們使用PHP urlencode()函數(shù)對圖像文件名進行編碼,以便可以安全地將其作為URL參數(shù)傳遞,因為文件名可能包含URL不安全字符。
這是“ download.php”文件的完整代碼,可強制下載圖像。
<?php if(isset($_REQUEST["file"])){ //獲取參數(shù) $file = urldecode($_REQUEST["file"]); //解碼URL編碼的字符串 /* 測試文件名是否包含非法字符 例如使用正則表達式的“ ../” */ if(preg_match('/^[^.][-a-z0-9_.]+[a-z]$/i', $file)){ $filepath = "images/" . $file; // 流程下載 if(file_exists($filepath)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($filepath).'"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($filepath)); flush(); //沖洗系統(tǒng)輸出緩沖區(qū) readfile($filepath); die(); } else { http_response_code(404); die(); } } else { die("Invalid file name!"); } } ?>
同樣,您可以強制下載其他文件格式,例如.doc,pdf文件等。
上面示例(第8行)中的正則表達式將完全不允許名稱以點字符(.)開頭或結(jié)尾的文件,例如,例如,它允許使用kites.jpg或Kites.jpg,myscript.min.js等文件名,但不允許kites.jpg.或.kites.jpg。
請查看有關正則表達式的教程,以詳細了解正則表達式。