在 Symfony4 中保存文件没有任何作用
Saving file in Symfony4 doesn't do anything
我有页面,用户将在其中上传图片。这些图片会在打开此页面后全部加载,如果提交表单,会保存图片文件并加载其余的。
这周看了几十遍官方 Symfony 文档,我无法弄清楚为什么我的 function homeView()
什么也没做。
我真正想要的是将此文件保存在 /public/pictures
目录中,但它没有发生。
该网站正在刷新,没有给我任何错误消息或任何信息。我做错了什么吗?
家庭控制器 文件:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Response;
use App\Service\PicturesService;
use App\Entity\Picture;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class HomeController extends AbstractController
{
public function homeView()
{
$pictures = $this->getDoctrine()
->getRepository(Picture::class)
->findAll();
$form = $this->createFormBuilder()
->add('file', FileType::class)
->add('save', SubmitType::class)
->getForm();
if ($form->isSubmitted() && $form->isValid()) {
$formData = $form->getData();
try {
$formData->file->move(
$this->getParameter('pictures_directory'),
'file_name');
}
catch (FileException $e) {
return new Response($e);
}
/*
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($db_file_url);
$entityManager->flush();
*/
}
return $this->render('home.html.twig', array(
'form' => $form->createView(),
'pictures' => $pictures));
}
}
services.yaml 文件:
parameters:
locale: 'en'
pictures_directory: '%kernel.project_dir%/public/pictures'
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
树枝视图 形式:
{{ form(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
首先,由于未提交表单,您的代码永远不会到达控制器中第一个 if
语句的内部代码。在表单实例化下方添加以下行:
$form->handleRequest($request);
要使表单处理正常工作,您需要键入提示 Symfony\Component\HttpFoundation\Request
对象作为 homeView()
方法中的参数:
public function homeView(Symfony\Component\HttpFoundation\Request $request)
现在正在提交您的表单,您将遇到以下错误:
Notice: Trying to get property 'file' of non-object
发生该错误是因为 $form
对象的 getData()
方法 returns 是一个数组,而不是一个对象。您需要访问此数组的 file
元素并对其调用 move()
方法:
$formData = $form->getData();
/** @var UploadedFile $file */
$file = $formData['file'];
$file->move('var/files', 'file_name');
我有页面,用户将在其中上传图片。这些图片会在打开此页面后全部加载,如果提交表单,会保存图片文件并加载其余的。
这周看了几十遍官方 Symfony 文档,我无法弄清楚为什么我的 function homeView()
什么也没做。
我真正想要的是将此文件保存在 /public/pictures
目录中,但它没有发生。
该网站正在刷新,没有给我任何错误消息或任何信息。我做错了什么吗?
家庭控制器 文件:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Response;
use App\Service\PicturesService;
use App\Entity\Picture;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class HomeController extends AbstractController
{
public function homeView()
{
$pictures = $this->getDoctrine()
->getRepository(Picture::class)
->findAll();
$form = $this->createFormBuilder()
->add('file', FileType::class)
->add('save', SubmitType::class)
->getForm();
if ($form->isSubmitted() && $form->isValid()) {
$formData = $form->getData();
try {
$formData->file->move(
$this->getParameter('pictures_directory'),
'file_name');
}
catch (FileException $e) {
return new Response($e);
}
/*
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($db_file_url);
$entityManager->flush();
*/
}
return $this->render('home.html.twig', array(
'form' => $form->createView(),
'pictures' => $pictures));
}
}
services.yaml 文件:
parameters:
locale: 'en'
pictures_directory: '%kernel.project_dir%/public/pictures'
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
树枝视图 形式:
{{ form(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
首先,由于未提交表单,您的代码永远不会到达控制器中第一个 if
语句的内部代码。在表单实例化下方添加以下行:
$form->handleRequest($request);
要使表单处理正常工作,您需要键入提示 Symfony\Component\HttpFoundation\Request
对象作为 homeView()
方法中的参数:
public function homeView(Symfony\Component\HttpFoundation\Request $request)
现在正在提交您的表单,您将遇到以下错误:
Notice: Trying to get property 'file' of non-object
发生该错误是因为 $form
对象的 getData()
方法 returns 是一个数组,而不是一个对象。您需要访问此数组的 file
元素并对其调用 move()
方法:
$formData = $form->getData();
/** @var UploadedFile $file */
$file = $formData['file'];
$file->move('var/files', 'file_name');