在本教程中,您將學(xué)習(xí)如何使用PHP強(qiáng)制下載文件。
通常,您不一定需要使用任何服務(wù)器端腳本語(yǔ)言(例如PHP)來(lái)下載圖像,zip文件,pdf文檔,exe文件等。如果此類文件存儲(chǔ)在公共可訪問(wèn)的文件夾中,則只需創(chuàng)建一個(gè)指向該文件的超鏈接,每當(dāng)用戶單擊鏈接時(shí),瀏覽器都會(huì)自動(dò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或圖像文件的鏈接不會(huì)導(dǎo)致其直接下載到硬盤(pán)驅(qū)動(dòng)器。它將僅在瀏覽器中打開(kāi)文件。此外,您可以將其保存到硬盤(pán)中。但是,默認(rèn)情況下,zip和exe文件會(huì)自動(dòng)下載到硬盤(pán)驅(qū)動(dòng)器。
您可以使用PHP readfile()函數(shù)強(qiáng)制將圖像或其他類型的文件直接下載到用戶的硬盤(pán)上。在這里,我們將創(chuàng)建一個(gè)簡(jiǎn)單的圖像庫(kù),允許用戶單擊鼠標(biāo)從瀏覽器下載圖像文件。
讓我們創(chuàng)建一個(gè)名為“ 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)建圖片庫(kù) 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>
如果仔細(xì)查看上面的示例代碼,則會(huì)發(fā)現(xiàn)指向“ download.php”文件的下載鏈接點(diǎn),該URL還包含圖像文件名作為查詢字符串。另外,我們使用PHP urlencode()函數(shù)對(duì)圖像文件名進(jìn)行編碼,以便可以安全地將其作為URL參數(shù)傳遞,因?yàn)槲募赡馨琔RL不安全字符。
這是“ download.php”文件的完整代碼,可強(qiáng)制下載圖像。
<?php if(isset($_REQUEST["file"])){ //獲取參數(shù) $file = urldecode($_REQUEST["file"]); //解碼URL編碼的字符串 /* 測(cè)試文件名是否包含非法字符 例如使用正則表達(dá)式的“ ../” */ 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!"); } } ?>
同樣,您可以強(qiáng)制下載其他文件格式,例如.doc,pdf文件等。
上面示例(第8行)中的正則表達(dá)式將完全不允許名稱以點(diǎn)字符(.)開(kāi)頭或結(jié)尾的文件,例如,例如,它允許使用kites.jpg或Kites.jpg,myscript.min.js等文件名,但不允許kites.jpg.或.kites.jpg。
請(qǐng)查看有關(guān)正則表達(dá)式的教程,以詳細(xì)了解正則表達(dá)式。