You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moodle环境下PHP批量下载证书失败问题求助

Moodle证书批量打包下载功能修复

问题核心

前端已通过复选框将选中证书的完整URL传入后端$certlist数组,但后端代码仍使用固定测试文件数组,未处理实际选中的证书;且直接用file_exists()、file_get_contents()处理远程URL会失效。

修改后的完整后端代码

<?php
require_once('../../config.php');
global $DB, $CFG;

// 校验请求合法性
if ($_SERVER['REQUEST_METHOD'] !== 'POST' || empty($_POST['select_cert'])) {
    die('无效请求');
}

$certlist = $_POST['select_cert'];
$zip_name = time() . "_certificates.zip"; 
$zip = new ZipArchive();

// 初始化Zip压缩包
if ($zip->open($zip_name, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
    die('无法创建压缩文件');
}

foreach ($certlist as $cert_url) {
    // 清理URL中的多余空格(从打印的数组可见存在空格问题)
    $cert_url = trim($cert_url);
    $filename = basename(parse_url($cert_url, PHP_URL_PATH));

    // 用CURL获取远程证书(携带会话Cookie,适配Moodle权限验证)
    $ch = curl_init($cert_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
    $file_content = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    // 仅当成功获取文件时添加到Zip
    if ($http_code === 200 && !empty($file_content)) {
        $zip->addFromString($filename, $file_content);
    } else {
        error_log("获取证书失败:$cert_url,HTTP状态码:$http_code");
    }
}

$zip->close();

// 触发浏览器下载
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . $zip_name . '"');
header('Content-Length: ' . filesize($zip_name));
readfile($zip_name);

// 删除服务器临时文件
unlink($zip_name);
exit;
?>

前端复选框代码优化(解决URL空格问题)

<?php
$certificate = get_certificate($userid, $c_id);
if (!empty($certificate)) {  
    $clean_cert_url = trim($certificate);
    echo "<input type='checkbox' class='checkboxcert' name='select_cert[]' value='$clean_cert_url'>";
}
echo "</td>";
echo "<td>";
?>

关键注意点

  • 必须清理证书URL中的空格,否则CURL无法正常请求
  • 携带会话Cookie是为了通过Moodle的权限校验,确保能访问用户有权限的证书
  • 下载完成后删除临时Zip文件,避免服务器存储空间浪费
  • 错误信息用error_log()记录,不要直接输出给用户

内容的提问来源于stack exchange,提问作者kritika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:55:21