如何在CKFinder 3中传入参数打开对应编辑页的指定文件夹?
问题分析与解决方案
核心问题:你打开CKFinder模态框时,未将当前页面的dir参数传递给CKFinder后端入口,导致config.php无法获取到$_GET['dir']参数。以下是具体修复步骤:
1. 前端传递dir参数到CKFinder
当前的CKFinder.modal()调用未携带自定义参数,需先从当前页面URL提取dir值,再通过url配置项将参数附加到CKFinder入口地址。
修改JavaScript代码:
var button1 = document.getElementById( 'ckfinder-galerie' ); button1.onclick = function() { selectFileWithCKFinder( 'ckfinder-input-1' ); }; // 新增:从当前URL提取指定参数的工具函数 function getUrlParam(name) { const params = new URLSearchParams(window.location.search); return params.get(name); } function selectFileWithCKFinder( elementId ) { // 获取当前页面的dir参数 const dirParam = getUrlParam('dir'); CKFinder.modal( { chooseFiles: true, width: 800, height: 600, // 关键:将dir参数附加到CKFinder入口URL(替换为你的实际CKFinder路径) url: '/ckfinder/ckfinder.php' + (dirParam ? `?dir=${encodeURIComponent(dirParam)}` : ''), onInit: function( finder ) { finder.on( 'files:choose', function( evt ) { var file = evt.data.files.first(); var output = document.getElementById( elementId ); output.value = file.getUrl(); } ); finder.on( 'file:choose:resizedImage', function( evt ) { var output = document.getElementById( elementId ); output.value = evt.data.resizedUrl; } ); } } ); }
2. 修正后端config.php代码
你的config.php存在两个问题:$galleryDir未初始化(无参数时会触发未定义变量错误),调试用的die()会直接终止程序。修改后的代码如下:
// 先初始化变量,避免无参数时的错误 $galleryDir = ''; if(isset($_GET['dir'])) { // 安全过滤:防止目录遍历攻击,仅保留合法字符 $safeDir = preg_replace('/[^a-zA-Z0-9_\-]/', '', $_GET['dir']); $galleryDir = '/' . $safeDir; } $config['resourceTypes'][] = array( 'name' => 'Photos', 'directory' => 'photos' . $galleryDir, 'maxSize' => 0, 'allowedExtensions' => 'bmp,gif,jpeg,jpg,png', 'deniedExtensions' => '', 'backend' => 'default' );
其他可行方案(Session传递参数)
若不想通过URL暴露参数,可使用Session传递:
- 在当前编辑页面的PHP代码中存入Session:
session_start(); // 同样需做安全过滤 $safeDir = preg_replace('/[^a-zA-Z0-9_\-]/', '', $data['gallery']); $_SESSION['ckfinder_target_dir'] = $safeDir;
- 在
config.php中读取Session值:
session_start(); $galleryDir = ''; if(isset($_SESSION['ckfinder_target_dir'])) { $galleryDir = '/' . $_SESSION['ckfinder_target_dir']; // 用完销毁,避免后续请求受影响 unset($_SESSION['ckfinder_target_dir']); }
内容的提问来源于stack exchange,提问作者Grégory Santana
相关产品推荐
相关产品推荐

