此教程将学习如何使用 PHP 下载文件。
只需按照以下示例轻松实现该目标。
使用 readfile() 函数
如果你想让不同类型的文件或者图片直接用PHP加载到用户的驱动器中,你可以运行readfile()函数。
让我们以创建图库为例,看看如何做到这一点,这用户一键下载图像文件。
在下面的示例中,生成了一个 image-gallery.php 并其中放置了一段代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Simple Image Gallery</title>
<style>
.img-box {
display: inline-block;
text-align: center;
margin: 0 15px;
}
</style>
</head>
<body>
<?php
//Array encompassing sample image file names
$images = array("kites.jpg", "balloons.jpg");
//Looping through the array to generate an image gallery
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.php?file=' . urlencode($image) . '">Download</a></p>';
echo '</div>';
}
?>
</body>
</html>
因此,在上面的示例中,下载链接指向 download.php 文件。
反过来,URL 包含图像文件名,就像查询字符串一样。
此外,我们还可以注意到, urlencode() 函数用于对图像文件名进行编码,使它们可以像 URL 参数一样安全地传递。
原因是文件名可能包含不安全的 URL 字符。
download.php,强制图片下载的完整代码如下:
<?php
if(isset($_REQUEST["file"])){
//Get parameters
$file = urldecode($_REQUEST["file"]); //Decode URL-encoded string
/* Check if the file name includes illegal characters
like "../" using the regular expression */
if(preg_match('/^[^.][-a-z0-9_.]+[a-z]$/i', $file)){
$filepath = "images/" . $file;
//Process download
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!");
}
}
?>
其他文件格式,如pdf、doc等,也可以通过上面演示的方式下载。
重要的是要考虑在上面的示例中,正则表达式(第 8 行)不允许名称以点 (.) 开头或者结尾的文件。
例如,我们可以使用books.jpg 或者Books.jpg 等文件名,但不能使用books.jpg.、 .kites.jpg 等。
日期:2020-06-02 22:15:42 来源:oir作者:oir
