编写PHP函数实现文件安全下载 ?
参考答案:
当涉及到文件安全下载时,我们需要确保文件的内容在传输过程中不被篡改,并且只有授权的用户能够访问文件。以下是一个使用PHP编写的简单函数,用于实现文件的安全下载:
function secureDownloadFile($filePath, $fileName)
{
// 检查文件是否存在
if (!file_exists($filePath)) {
header("HTTP/1.0 404 Not Found");
echo "File not found.";
exit();
}
// 检查文件是否为可下载文件
$allowedMimes = array(
'text/plain',
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/zip',
// 添加其他允许下载的MIME类型
);
$fileMime = mime_content_type($filePath);
if (!in_array($fileMime, $allowedMimes)) {
header("HTTP/1.0 403 Forbidden");
echo "File type not allowed for download.";
exit();
}
// 设置文件下载相关的HTTP头信息
header('Content-Description: File Transfer');
header('Content-Type: ' . $fileMime);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filePath));
header('Content-Disposition: attachment; filename="' . basename($fileName) . '"');
// 读取文件内容并输出给浏览器
readfile($filePath);
exit();
}
使用这个函数时,你需要传入两个参数:$filePath
是文件的完整路径,$fileName
是要在浏览器中显示的文件名。
这个函数首先检查文件是否存在,如果不存在则返回404错误。然后,它检查文件的MIME类型是否在允许的列表中,以确保只允许下载特定的文件类型。如果MIME类型不在列表中,则返回403错误。
接下来,函数设置了一系列的HTTP头信息,以指示浏览器进行文件下载。这包括文件的描述、类型、传输编码、过期时间、缓存控制、Pragma、内容长度和内容处置等。
最后,函数使用readfile()
函数读取文件内容,并将其输出给浏览器。这样,浏览器就会开始下载文件,而不是在浏览器中显示文件内容。
请注意,这只是一个简单的示例函数,用于说明文件安全下载的基本思路。在实际应用中,你可能还需要添加其他安全措施,例如身份验证、访问控制列表(ACL)等,以确保只有授权的用户能够访问和下载文件。