Symfony3上传文件而不使用FormBuilder

时间:2017-07-06 10:22:57

标签: php forms symfony formbuilder

我有一个包含文件的项目,当我创建新项目时,我使用FormBuilder创建了表单,并且我有一个来自FileType的字段,然后将其转换为UploadedFile并且它工作良好。我想要的是能够在该文件之后上传而无需编辑项目。一个简单的"添加更多文件"按钮。不需要其他字段,因此 - 不需要FormBuilder。我也不想要"保存"按钮"添加更多文件"点击。我想点击它选择我的文件,当我点击"打开"要提交的表格。这是我用以下代码实现的

<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,我不知道该怎么做。

这是提交的内容 enter image description here

由此我不知道如何将filePath实际添加到UploadedFile的构造函数中。此外,当我调试项目创建过程中发生的事情时(我使用FileType),我看到filePath是&#34; C:\ xampp \ tmp&#34;我不知道它来自哪里。我的第一个想法是简单地使用此代码

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

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

  

文件&#34; C:\ xampp \ tmp&#34;不存在

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

此时我投降了,就像是#34;好吧......如果它想让我如此糟糕地使用FormBuilder - 那么我会&#34;。这是AddFileType中的代码(与任何实体或任何东西无关)

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

这是另一个问题 - 我希望能够在没有提交按钮的情况下提交表单。只需当我点击&#34;添加更多文件&#34;并选择一些文件作为我提交的表格。

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

2 个答案:

答案 0 :(得分:1)

我认为您需要将映射设置为true,因为通过将其设置为false,它不会是此字段与数据库字段之间的关系

 idEditText =(EditText) findViewById(R.id.editText_id);
nameEditText =(EditText)findViewById(R.id.editText_Name);
dateEditText =(EditText)findViewById(R.id.editText_Date);

private boolean checkEmptyFields() {
    boolean check = false
    String id = idEditText.getText().toString().trim();
    String name = nameEditText.getText().toString().trim();
    String date = dateEditText.getText().toString().trim();

    if (id.isEmpty()) {
        idEditText.setError("Invalid Input");
        check = true;
    } else {
        dEditText.setError(null);
        check = false;
    }

    if (name.isEmpty()) {
        nameEditText.setError("Invalid Input");
        check = true;
    } else {
        nameEditText.setError(null);
        check = false;
    }

    if (date.isEmpty()) {
        dateEditText.setError("Invalid Input");
        check = true;
    } else {
        dateEditText.setError(null);
        check = false;
    }
 return check;
}



if (!checkEmptyFields())
{
//Add Data to DB
}

答案 1 :(得分:0)

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')));


}