Zend Framework 3上传图片前修改文件名及获取新文件名问题
解决Zend Form图片上传的两个需求问题
你提到用Zend Form的Input Filter配置了图片上传,能正常上传但有两个需求没搞定,我来帮你逐一解决:
1. 新增实体时,如何把实体ID前置到文件名?
这个问题的核心是新增实体时还没有生成ID,没法在上传阶段直接把ID加到文件名里,得分两步走:
方案:先传临时目录,存实体后重命名
- 第一步,调整
FileRenameUpload的目标目录到临时文件夹,修改过滤配置:"filters" => [ [ "name" => "FileRenameUpload", "options" => [ "target" => getcwd() . "/public/uploads/temp", // 临时存储目录 "useUploadName" => true, "useUploadExtension" => true, "overwrite" => true, "randomize" => true, ], ], ], - 第二步,在控制器里执行以下操作:
- 表单验证通过后,先把实体数据保存到数据库,此时就能拿到自动生成的
$entity->getId() - 获取上传后的临时文件信息(参考第二个问题的方法),得到临时文件的完整路径
- 用
rename()函数把临时文件移动到最终的logos目录,并重命名为$id . '_' . $原文件名(比如123_mylogo.png) - 把新的文件路径更新到实体中,再保存一次实体到数据库
- 表单验证通过后,先把实体数据保存到数据库,此时就能拿到自动生成的
编辑实体的特殊处理
如果是编辑已有实体(已经有ID),可以直接用filenameCallback生成带ID的文件名,不用临时目录:
"filters" => [ [ "name" => "FileRenameUpload", "options" => [ "target" => getcwd() . "/public/uploads/logos", "useUploadName" => false, "useUploadExtension" => true, "overwrite" => true, "randomize" => false, "filenameCallback" => function($file) use ($entity) { return $entity->getId() . '_' . $file['name']; }, ], ], ],
2. 如何获取上传后的新文件名?
你用$form->getData()拿到旧文件名,是因为getData()返回的数组里,ImageLogo字段的name键存的是原文件名,而新文件名和完整路径存在tmp_name键里。你可以这样获取:
if ($form->isValid()) { // 获取文件元素的过滤后数据 $fileData = $form->get('ImageLogo')->getValue(); // 从完整路径中提取新文件名 $newFileName = basename($fileData['tmp_name']); // 完整的新文件路径就是$fileData['tmp_name'] echo "新文件名:" . $newFileName; exit(); }
或者直接从getData()结果中提取:
$formData = $form->getData(); $newFilePath = $formData['ImageLogo']['tmp_name']; $newFileName = basename($newFilePath);
这样就能拿到重命名后的新文件名了。
内容的提问来源于stack exchange,提问作者Ali Rasheed
相关产品推荐
相关产品推荐

