CKFinder 3.5(PHP版):如何按上传月份存储文件?
CKFinder 3.5 实现文件按上传月份存储的解决方案
你的旧代码失效是因为CKFinder 3.x完全重构了核心API,旧版本的类(如CKFinder_Connector_Utils_FileSystem)和属性(如_currentFolder)已被废弃,无法适配3.5版本。以下是针对3.5版本的有效实现方案:
方案一:全局修改所有上传的存储路径
在CKFinder的config.php文件中,添加事件监听代码,自动将所有上传的文件存入对应年月的文件夹:
use CKSource\CKFinder\Event\BeforeFileUploadEvent; use Symfony\Component\EventDispatcher\EventDispatcher; $config['events'] = function (EventDispatcher $dispatcher) { $dispatcher->addListener(BeforeFileUploadEvent::NAME, function (BeforeFileUploadEvent $event) { // 获取当前上传的目标文件夹 $targetFolder = $event->getFolder(); // 生成年月格式的子文件夹路径(如 2024/08) $monthSubfolder = date('Y/m'); // 创建子文件夹(不存在则自动递归创建) $newTargetFolder = $targetFolder->createSubFolder($monthSubfolder); // 将上传目标改为新文件夹 $event->setFolder($newTargetFolder); }); };
方案二:仅针对「快速上传(QuickUpload)」命令生效
如果你只想让快速上传的文件存入年月文件夹,可使用以下代码修改请求参数:
use CKSource\CKFinder\Event\BeforeCommandExecuteEvent; use Symfony\Component\EventDispatcher\EventDispatcher; $config['events'] = function (EventDispatcher $dispatcher) { $dispatcher->addListener(BeforeCommandExecuteEvent::NAME, function (BeforeCommandExecuteEvent $event) { $command = $event->getCommandName(); // 仅处理QuickUpload命令 if ($command !== 'QuickUpload') { return; } $request = $event->getRequest(); $container = $event->getContainer(); // 获取后端存储与文件夹实例 $backendManager = $container->get('backend_manager'); $folderFactory = $container->get('folder_factory'); $backendName = $request->get('backend', 'default'); $currentFolderPath = $request->get('currentFolder', '/'); $backend = $backendManager->getBackend($backendName); $currentFolder = $folderFactory->create($backend, $currentFolderPath); // 创建年月子文件夹 $monthSubfolder = date('Y/m'); $newFolder = $currentFolder->createSubFolder($monthSubfolder); // 修改请求中的目标文件夹路径 $request->query->set('currentFolder', $newFolder->getPath()); }); };
注意事项
- 确保服务器对CKFinder的存储目录有写入权限,否则无法自动创建年月文件夹。
- 测试前请备份原
config.php文件,避免配置错误导致功能异常。
内容的提问来源于stack exchange,提问作者Kaaogin
相关产品推荐
相关产品推荐

