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')));
}
我有一个包含文件的项目,当我创建新项目时,我使用 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')));
}