Symfony3 不使用 FormBuilder 上传文件

Symfony3 upload file without using FormBuilder

我有一个包含文件的项目,当我创建新项目时,我使用 FormBuilder 创建了表单,并且我有一个来自 FileType 的字段,然后将其转换为 UploadedFile它工作正常。我想要的是能够在无需编辑项目的情况下上传这些文件。一个简单的 "Add more files" 按钮。不需要其他字段,因此 - 不需要 FormBuilder。我也不想在点击 "Add more files" 后出现 "save" 按钮。我想单击它选择我的文件,然后单击 "Open" 提交表单。这是我用下面的代码实现的

<form action="{{ path('image_upload', { 'id': project.id }) }}" method="post" name="form">                              
  <div class="col-md-2" id="imageUpload">
    <span>Add More Files</span>
      <input type="file" readonly="readonly" id="imageUpload" name="image_upload[]" onchange="form.submit()" multiple/><div class="upload_icon"></div>
  </div>    
</form> 

如您所见,此表单只有 onChange 提交的这个按钮。我的问题是提交后文件不是 UploadedFile 类型,而且我用于上传图片的服务不起作用。我尝试自己创建一个 UploadedFile 的实例,但它需要 filePath,我不知道如何获取。

这是提交的内容

从这里我不知道如何获取 filePath 以实际将其添加到 UploadedFile 的构造函数中。此外,当我调试项目创建过程中发生的事情时(我使用 FileType),我看到文件路径是 "C:\xampp\tmp",我不知道它来自哪里。我的第一个想法是用这段代码

简单地将它添加到 UploadedFile 的构造函数中
$file = new UploadedFile("C:\xampp\tmp",$file);

当我 运行 它时,我收到此错误 -

The file "C:\xampp\tmp" does not exist

所以回顾一下 - 这是 $file->getPath() 在我使用 FileType 时给我的路径,但如果没有它,当我有简单的上传按钮时,它不存在。

此时我投降了,就像"Okay...If it wants me to use FormBuilder so badly - then I will"。这是 AddFileType 中的代码(与任何实体或任何东西无关)

$builder->
        add("addFiles",FileType::class,array(
            'label'=>'Add More Files',
            'multiple'=> true,
            'mapped'=> false,
            "required"=>false
        ));

这是另一个问题 - 我希望能够在没有提交按钮的情况下提交表单。只需单击 "Add More Files" 和 select 一些文件即可为我提交表单。

我的问题 - 有没有办法在使用简单上传按钮时获取文件路径,从而创建 UploadedFile 的实例并将其从我的服务发送到我的数据库。如果没有 - FormBuilder 有没有办法在单击 FileType 按钮提交表单时做到这一点,而不需要任何提交按钮。

我认为您需要将 mapped 设置为 true,因为如果将其设置为 false,则此字段与数据库的字段之间将没有关系

$builder->
    add("addFiles",FileType::class,array(
        'label'=>'Add More Files',
        'multiple'=> true,
        'mapped'=> true,
        "required"=>false
    ));
public function addArticleAction(Request $request){

    //get pic from http request
    $Image = $this->getRequest()->files->get('artPic'); 

    //generate a unique name for pic
    $picName = $this->generateUniqueFileName().'-'.$Image->getClientOriginalName();

    //move pic to a directory
    $Image->move(
            $this->getParameter('pic_directory'),
            $picName
        );

    //store picName in db
    $article = new FlashInfo;
    $article->setPhoto($picName);

      //other data  
     $request = $request->request->all();
     $article->setTitle($request['arTitle']);
     $article->setTitle($request['arText']);
     $article->setTitle($request['artSource']);


 return new Response(json_encode(array('status'=>'success')));


}