在本教程中,您將學(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á)式。