自定义模块在System Configuration里加了证书或Logo上传字段,页面提示保存成功,刷新后输入框又空了,目标目录也没有文件。先看core_config_data是否写入;这一步能快速区分保存逻辑和展示逻辑。
SELECT scope,scope_id,path,value FROM core_config_data WHERE path='vendor_module/general/file';
一个可工作的字段需要三部分
system.xml里要声明file类型、上传目录和必要的backend model;目录配置必须与读取URL方式一致。图片可使用Magento的Image backend,私密证书则不能放在pub/media公开目录。
<field id="file" type="file"> <backend_model>Vendor\Module\Model\Config\Backend\File</backend_model> <upload_dir config="system/filesystem/media" scope_info="1">vendor</upload_dir> </field>
用日志观察保存数组
在自定义backend model的beforeSave中临时记录getValue的键名,不记录文件内容。正常上传通常包含name、tmp_name、type、size;没有tmp_name时检查PHP上传限制和临时目录权限。
php -i | grep -E 'upload_max_filesize|post_max_size|upload_tmp_dir' ls -ld pub/media var/tmp
刷新为空但文件已存在
这多半是backend model保存了绝对路径,而配置渲染期期待相对路径;或field path与读取path不一致。数据库只保存稳定的相对文件名,展示或读取时再与安全目录拼接。
删除旧文件要谨慎
处理delete复选框时先确认新文件是否同时上传,避免先删旧文件、随后新上传失败导致配置两空。私密密钥限制扩展名、MIME与最大大小,并放在Web根目录外。
最终测试首次上传、覆盖上传、只保存其他配置、勾选删除和上传失败五种情况;每次核对数据库值、磁盘文件和实际业务读取路径。

