跳到主要内容

编写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)等,以确保只有授权的用户能够访问和下载文件。