我有一个带有文件上传字段的表单(仅限于 PDF 格式)。提交表单并且存在有效的上传文件后,我重命名并移动文件。然后我尝试再次显示带有表单的页面——此时Symfony\Component\HttpFoundation\File\File
类构造函数抛出一个FileNotFoundException
,因为出于某种原因,它已被传递到不再存在的临时文件的路径。
相关事实:
- 表单字段(包括文件上传字段)未映射到实体,因为我使用 Wordpress 样式的“元”表来存储与实体关联的附加数据;控制器处理创建要持久化的任何新对象。
- 新文件名成功保存到数据库;我进一步验证了 $form->createView() 调用会发生错误。
- 在有人提出这是由于我的 PHP 设置造成的之前,请注意我故意尝试上传大小低于限制的 PDF 文件。
- 我的临时解决方案是重定向到另一个页面(这样做时没有错误),但从长远来看,提交表单后仍然显示表单页面更为理想。
- 我尝试用方法返回的对象覆盖
UploadedFile
我从表单中获得的对象,但这没有帮助。File
->move()
- 我还尝试创建内置类的子类
FileType
并将其更改data_class
为SplFileInfo
(Symfony 类的父类File
)b/cSplFileInfo
不会在无效路径上引发异常,但这也没有效果。
我对正在发生的事情的解释是,由于某种原因,当您创建表单视图时,SymfonyFile
使用旧的临时文件路径为文件上传字段实例化一个新对象 - 从而导致绝对不应该发生的致命错误(因为你什么时候不会移动上传的文件?)。
任何我还没有想到的尝试的建议将不胜感激!
解决了
我通过查看堆栈跟踪找出了问题 - 我有一个 Twig 扩展正在调用Request::createFromGlobals()
,这导致尝试使用不再存在的临时文件路径创建一个新的 UploadedFile 对象。让扩展Request
在其构造函数中获取已经存在的对象应该可以防止这种情况发生。