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
相关产品推荐
相关产品推荐

