我刚开始学习Symfony 3并且我开了一个博客。 我使用Doctrine Entities与数据库进行交互。我是Mac OS上的Xampp。
我创建了一个带有文件输入的表单,但是当我想上传文件时,它永远不会移动到应该的位置,在数据库中我会记录Xampp临时文件夹的路径。
以下是实体文件中代码的一部分:
public function getFile()
{
return $this->file;
}
public function setFile(UploadedFile $file = null)
{
$this->file = $file;
}
public function upload(){
if(null === $this->file){
return;
}
$name = $this->file->getClientOriginalName();
$this->file->move($this->getUploadRootDir(), $name);
$this->image = $name;
}
public function getUploadDir(){
return 'uploads/img';
}
public function getUploadRootDir(){
return '/../../../../web/'.$this->getUploadDir();
}
那是我的表单构建器:
class BlogType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('image', FileType::class)
->add('categorie', TextType::class)
->add('photographe', TextType::class)
->add('save', SubmitType::class)
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Boreales\PlatformBundle\Entity\Blog'
));
}
}
来自控制器的addAction:
public function addAction(Request $request)
{
//Création de l'entité
$photo = new Blog();
$form = $this->get('form.factory')->create(BlogType::class, $photo);
if($request->isMethod('POST') && $form->handleRequest($request)->isValid()){
$photo->upload();
$em = $this->getDoctrine()->getManager();
$em->persist($photo);
$em->flush();
$request->getSession()->getFlashBag()->add('notice', 'Photo enregistrée.');
var_dump($photo->getImage());
//return new Response('Coucou');
//return $this->redirectToRoute('galerie');
}
return $this->render('BorealesPlatformBundle:Blog:add.html.twig', array(
'form' => $form->createView()
));
}
有人能看出问题所在吗?
答案 0 :(得分:3)
一般情况下代码都可以,但您的path
存在问题。
你现在有这样的路径
return '/../../../../web/'.$this->getUploadDir();
从中删除前导斜杠
return '../../../../web/'.$this->getUploadDir();
开头的正斜杠是 root 目录。你不能超越它,它在顶层。
但是那也不会起作用,因为你需要一个绝对的目录路径。最好的方法是将此上传目录添加到config.yml
# app/config/config.yml
# ...
parameters:
upload_directory: '%kernel.root_dir%/../web/uploads/img'
然后使用它。但是由于它的设计,您不能直接从Model层访问这些参数。因此,您需要将其传递给您正在呼叫的方法。
//your controller
$photo->upload($this->getParameter('upload_directory'));
因此,您将使实体中的方法看起来像
public function upload($path){
if(null === $this->file){
return;
}
$name = $this->file->getClientOriginalName();
$this->file->move($path, $name);
$this->image = $name;
}
这将是您做自己想做的最好也是最合适的方式。希望它有所帮助!