Php 在会话中临时存储文件名

Php 在会话中临时存储文件名,php,forms,symfony,session,Php,Forms,Symfony,Session,我有一个表单,其中还包含一个file类型的输入。此表单连接到一个实体,正如在Symfony官方教程中所做的那样,其中创建了一个“表单类型”来连接实体和表单 每当我需要通过实体的表单更新实体时,我都会遇到问题,主要是因为输入文件 这个想法只是允许用户最终上传一个新文件(不涉及以前上传的文件,即旧文件不应该以某种方式返回给客户端,也因为我不知道在这种环境/情况下如何操作…) 然后,在控制器中,我可以检查用户是否上传了新文件,如果是,我可以删除旧文件。如果没有,我应该将存储上传文件名称的字段重置为“旧

我有一个表单,其中还包含一个file类型的输入。此表单连接到一个实体,正如在Symfony官方教程中所做的那样,其中创建了一个“表单类型”来连接实体和表单

每当我需要通过实体的表单更新实体时,我都会遇到问题,主要是因为输入文件

这个想法只是允许用户最终上传一个新文件(不涉及以前上传的文件,即旧文件不应该以某种方式返回给客户端,也因为我不知道在这种环境/情况下如何操作…)

然后,在控制器中,我可以检查用户是否上传了新文件,如果是,我可以删除旧文件。如果没有,我应该将存储上传文件名称的字段重置为“旧”文件的名称。在这两种情况下,我都需要在返回表单编辑实体之前跟踪“当前”文件的名称。我通过将其存储在会话中来实现这一点

我不知道这个想法是好是坏,可能是因为,在阅读了这么多关于会话的文章后,我仍然不清楚它们。我知道这是一种使HTTP请求处于完全状态的方法,但我仍然不清楚实现,也就是说,到底发生了什么

会话也可以被清除或终止,但我不知道在什么情况下。因此,我不知道在会话中存储旧/当前文件的名称有多危险

你能解释一下为什么这是个好主意还是个坏主意吗?如果是个坏主意,还有什么更好的选择


如果您感兴趣,这是相应的相关代码:

...

// store old brochure in the session,
// so that if the user doesn't upload a new file
// we use the old file
if(isset($product) && $request->isMethod('GET')) {
  $this->get('session')->set($product->getId(), $product->getBrochure());
}

$editForm = $this->createForm(ProductType::class, $product, ['brochure_required' => false]);
$editForm->handleRequest($request);

// remove previous file if a new file was uploaded
if($request->isMethod('POST')) {
    if(isset($request->files->get('product')['brochure'])) {

      $filePathToDelete = $this->getParameter('brochures_directory') . '/' . $this->get('session')->get($product->getId());

      if(is_file($filePathToDelete)) {
        unlink($filePathToDelete);
      }

    } else {
      $product->setBrochure($this->get('session')->get($product->getId()));
    }

  $this->get('session')->remove($product->getId());
}

...

这些文件是否存储在文件系统中?如果是这样,我认为您需要保留它们的名称(例如在数据库中)。使用外键,您可以知道已为特定父实体上载了哪个文件。对于任何感兴趣的人:文件上载。此外,变压器主要用于避免控制器中的逻辑