PHP 下载文件
在本教程中,您将学习如何使用 PHP 强制下载文件。
用 PHP 下载文件
通常,您不一定需要使用任何服务器端脚本语言(如 PHP)来下载图像、zip 文件、pdf 文档、exe 文件等。如果此类文件存储在公共可访问文件夹中,您可以 只需创建一个指向该文件的超链接,每当用户单击该链接时,浏览器就会自动下载该文件。
<a href="downloads/test.zip">Download Zip file</a>
<a href="downloads/masters.pdf">Download PDF file</a>
<a href="downloads/sample.jpg">Download Image file</a>
<a href="downloads/setup.exe">Download EXE file</a>
单击指向 PDF 或图像文件的链接不会导致它直接下载到您的硬盘驱动器。 它只会在您的浏览器中打开文件。 此外,您可以将其保存到硬盘中。 但是,默认情况下,zip 和 exe 文件会自动下载到硬盘驱动器。
使用 PHP 强制下载
您可以使用 PHP readfile()
函数强制将图像或其他类型的文件直接下载到用户的硬盘上。 在这里,我们将创建一个简单的图像库,允许用户通过单击鼠标从浏览器下载图像文件。
让我们创建一个名为"image-gallery.php"的文件并将以下代码放入其中。
<!DOCTYPE html>
<html lang="en">
<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>
<body>
<?php
// 包含示例图像文件名的数组
$images = array("kites.jpg", "balloons.jpg");
// 循环遍历数组以创建图像库
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.asp?file=' . urlencode($image) . '">Download</a></p>';
echo '</div>';
}
?>
</body>
</html>
如果您仔细查看上面的示例代码,您会发现下载链接指向一个"download.php"文件,该 URL 还包含图像文件名作为查询字符串。 此外,我们使用 PHP urlencode()
函数对图像文件名进行编码,以便可以安全地作为 URL 参数传递,因为文件名可能包含 URL 不安全字符。
这是"download.php"文件的完整代码,它强制下载图像。
<?php
if(isset($_REQUEST["file"])){
// 获取参数
$file = urldecode($_REQUEST["file"]); // Decode URL-encoded string
/* 测试文件名是否包含非法字符
例如使用正则表达式的"../" */
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(); // Flush system output buffer
readfile($filepath);
die();
} else {
http_response_code(404);
die();
}
} else {
die("Invalid file name!");
}
}
?>
同样,您可以强制下载其他文件格式,如 word doc、pdf 文件等。
上例 (第8行) 中的正则表达式将根本不允许名称以点字符 (.
) 开头或结尾的文件,例如,它允许文件名如 kites.jpg
或 Kites.jpg
, myscript.min.js
但不允许 kites.jpg.
或 .kites.jpg
。
请查看正则表达式教程,详细了解正则表达式。