0

我有一个带有文件上传字段的表单(仅限于 PDF 格式)。提交表单并且存在有效的上传文件后,我重命名并移动文件。然后我尝试再次显示带有表单的页面——此时Symfony\Component\HttpFoundation\File\File类构造函数抛出一个FileNotFoundException,因为出于某种原因,它已被传递到不再存在的临时文件的路径。

相关事实:

  • 表单字段(包括文件上传字段)未映射到实体,因为我使用 Wordpress 样式的“元”表来存储与实体关联的附加数据;控制器处理创建要持久化的任何新对象。
  • 新文件名成功保存到数据库;我进一步验证了 $form->createView() 调用会发生错误。
  • 在有人提出这是由于我的 PHP 设置造成的之前,请注意我故意尝试上传大小低于限制的 PDF 文件。
  • 我的临时解决方案是重定向到另一个页面(这样做时没有错误),但从长远来看,提交表单后仍然显示表单页面更为理想。
  • 我尝试用方法返回的对象覆盖UploadedFile我从表单中获得的对象,但这没有帮助。File->move()
  • 我还尝试创建内置类的子类FileType并将其更改data_classSplFileInfo(Symfony 类的父类File)b/cSplFileInfo不会在无效路径上引发异常,但这也没有效果。

我对正在发生的事情的解释是,由于某种原因,当您创建表单视图时,SymfonyFile使用旧的临时文件路径为文件上传字段实例化一个新对象 - 从而导致绝对不应该发生的致命错误(因为你什么时候不会移动上传的文件?)。

任何我还没有想到的尝试的建议将不胜感激!


解决了

我通过查看堆栈跟踪找出了问题 - 我有一个 Twig 扩展正在调用Request::createFromGlobals(),这导致尝试使用不再存在的临时文件路径创建一个新的 UploadedFile 对象。让扩展Request在其构造函数中获取已经存在的对象应该可以防止这种情况发生。

4

0 回答 0