在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; }) ]; } }
关键说明
- 标题转义处理:用Symfony的
SluggerInterface把标题转成无特殊字符的字符串,避免出现无效路径或文件名。 - 动态目录创建:通过
setUploadDir的回调,获取当前实体的标题,自动创建对应文件夹,确保目录存在后再返回路径。 - 自定义文件名:通过
setUploadedFileNamePattern的回调,用转义后的标题作为文件名,保留原文件的扩展名,保证文件格式正确。 - 权限与流程:要确保服务器对
public/img/films/目录有写入权限;EasyAdmin的表单会先处理所有字段(包括标题),再处理文件上传,所以能正常获取到标题值。
内容的提问来源于stack exchange,提问作者TugBenson
相关产品推荐
相关产品推荐

