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

在Symfony6的EasyAdmin中实现文件重命名与同名文件夹创建

在EasyAdmin中实现上传文件重命名为标题并创建同名文件夹

完全可以实现这个需求,通过EasyAdmin的ImageField提供的回调配置项,就能动态基于实体的标题生成文件夹和文件名。以下是修改后的代码实现:

use Symfony\Component\String\Slugger\SluggerInterface;

class YourCrudController extends AbstractCrudController
{
    private SluggerInterface $slugger;

    // 通过构造函数注入Slugger组件,处理标题中的特殊字符
    public function __construct(SluggerInterface $slugger)
    {
        $this->slugger = $slugger;
    }

    public function configureFields(string $pageName): iterable
    {
        return [
            TextField::new('title')->setLabel("Titre"),
            TextField::new("directed_by")->setLabel("Réalisateur"),
            DateTimeField::new("date_release")->setLabel("Date de sortie"),
            DateTimeField::new('date_created')->setLabel("Date de création de fiche")
                ->setFormTypeOption("data", new \DateTime("now")),
            ImageField::new("images")
                // 动态生成上传目录:基于标题创建同名文件夹
                ->setUploadDir(function ($entity) {
                    // 转义标题,避免特殊字符导致路径无效
                    $sluggedTitle = $this->slugger->slug($entity->getTitle())->lower();
                    $folderPath = 'public/img/films/' . $sluggedTitle;
                    
                    // 确保文件夹存在,不存在则递归创建
                    if (!is_dir($folderPath)) {
                        mkdir($folderPath, 0755, true);
                    }
                    
                    return $folderPath;
                })
                // 动态设置文件名:用转义后的标题+原文件扩展名
                ->setUploadedFileNamePattern(function ($file, $entity) {
                    $sluggedTitle = $this->slugger->slug($entity->getTitle())->lower();
                    $extension = $file->guessExtension() ?? 'jpg'; // 兜底默认扩展名
                    
                    return $sluggedTitle . '.' . $extension;
                })
        ];
    }
}

关键说明

  1. 标题转义处理:用Symfony的SluggerInterface把标题转成无特殊字符的字符串,避免出现无效路径或文件名。
  2. 动态目录创建:通过setUploadDir的回调,获取当前实体的标题,自动创建对应文件夹,确保目录存在后再返回路径。
  3. 自定义文件名:通过setUploadedFileNamePattern的回调,用转义后的标题作为文件名,保留原文件的扩展名,保证文件格式正确。
  4. 权限与流程:要确保服务器对public/img/films/目录有写入权限;EasyAdmin的表单会先处理所有字段(包括标题),再处理文件上传,所以能正常获取到标题值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:57:54