如何解决 Symfony2 中的 "Unable to create the "%kernel.root_dir%/../web/uploads"directory" 错误
How to solve "Unable to create the "%kernel.root_dir%/../web/uploads" directory" error in Symfony2
我正在使用一个包来上传任何类型的文件。
为此,我使用以下文件创建了一个新包 uploadBundle:
实体"Archivo.php"
<?php
namespace SisEvo\UploadBundle\Entity;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
*/
class Archivo {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="integer")
*/
private $idTipo;
/**
* @ORM\Column(type="integer")
*/
private $idAgregado;
/**
* @var File
*
* @Assert\File(
* maxSize = "50M",
* mimeTypes = {"application/pdf", "application/x-pdf, application/x-rar-compressed, application/octet-stream, application/csv, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/msword, application/vnd.ms-excel"},
* maxSizeMessage = "El arxiu es massa gran",
* mimeTypesMessage = "El tipus d'arxiu seleccionat no està permitit"
* )
*/
protected $file;
此外,该实体包含 get
和 set
必需的方法,最后还有一个 upload 方法,如下所示:
public function upload($file, $path = '%kernel.root_dir%/../web/uploads') {
if (null === $file) {
return;
}
$name = $file->getClientOriginalName();
$file->move(
$path, $name
);
unset($file);
}
表格"ArchivoType.php"
<?php
namespace SisEvo\UploadBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
class ArchivoType extends AbstractType {
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('file', 'file')
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => 'SisEvo\UploadBundle\Entity\Archivo'
));
}
}
控制器"UploadController.php"
class UploadController extends Controller {
/**
* @Route("/file_upload/" , name = "file_upload")
*/
public function probarAction() {
$request = $this->getRequest();
$file = new Archivo();
$formulario = $this->createForm(new ArchivoType());
$formulario->handleRequest($request);
if ($formulario->isValid()) {
$em = $this->getDoctrine()->getManager();
$data = $formulario->getData();
$fileUploaded = $data->getFile();
$file->upload($fileUploaded);
echo "SUCCESS!";
}
return $this->render("upload/prova.html.twig"
, array("formulario" => $formulario->createView())
);
}
}
问题
如果文件夹/uploads
不存在,这段代码可以正常工作;这是我第一次使用它,但 Symfony 在以下时间显示此错误:
Unable to create the "%kernel.root_dir%/../web/uploads" directory
而这个错误是在vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/File/File.php的第110行
的这段代码中产生的
if (!is_dir($directory)) {
if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) {
throw new FileException(sprintf('Unable to create the "%s" directory', $directory));
}
} elseif (!is_writable($directory)) {
throw new FileException(sprintf('Unable to write in the "%s" directory', $directory));
Symfony 似乎找不到 uploads
文件夹。
我尝试使用 chmod 777 -R 更改权限,但问题仍然存在。
有解决这个问题的想法吗?
提前致谢:)
编辑更多信息
第一
我正在创建一个服务来从我的应用程序的任何部分上传文件,所以我创建了一个包含实体和简单表单的包。上面的controllerpost只是一个证明,当uploadBundle
完成后,这个controller会被删除,upload方法会用在我需要的应用程序的各个部分。
此外,将每个上传文件的信息存储在数据库中的代码尚未开发。
拜托,你能解释一下为什么我的架构不对吗?谢谢:)
第二
Chmod
从 symfony 内核获取八进制 777; 问题部分的代码post来自symfony。
第三
你是对的,代码并不像我预期的那样工作。它在 web 文件夹中创建一个文件夹,如下所示:web/web/uploads
。我需要获得有关 Symfony 内部文件夹的更多信息。无论如何,@pablo 的回答解决了我的问题。
您获取 $path (kernel.root_dir) 的方式是错误的
试试这个方法:
public function probarAction() {
$request = $this->getRequest();
$file = new Archivo();
$formulario = $this->createForm(new ArchivoType());
$formulario->handleRequest($request);
if ($formulario->isValid()) {
$em = $this->getDoctrine()->getManager();
$data = $formulario->getData();
$fileUploaded = $data->getFile();
$path = $this->get('kernel')->getRootDir() . '/../web/uploads';
$file->upload($fileUploaded, $path);
echo "SUCCESS!";
}
return $this->render("upload/prova.html.twig"
, array("formulario" => $formulario->createView())
);
}
如果您有一些进展,请告诉我们
问候
添加了基于@Isaac 评论的文档链接:
获取 $path 的更有效方法:
$this->getParameter('kernel.root_dir') . '/../web/uploads';
我正在使用一个包来上传任何类型的文件。
为此,我使用以下文件创建了一个新包 uploadBundle:
实体"Archivo.php"
<?php
namespace SisEvo\UploadBundle\Entity;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
*/
class Archivo {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="integer")
*/
private $idTipo;
/**
* @ORM\Column(type="integer")
*/
private $idAgregado;
/**
* @var File
*
* @Assert\File(
* maxSize = "50M",
* mimeTypes = {"application/pdf", "application/x-pdf, application/x-rar-compressed, application/octet-stream, application/csv, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/msword, application/vnd.ms-excel"},
* maxSizeMessage = "El arxiu es massa gran",
* mimeTypesMessage = "El tipus d'arxiu seleccionat no està permitit"
* )
*/
protected $file;
此外,该实体包含 get
和 set
必需的方法,最后还有一个 upload 方法,如下所示:
public function upload($file, $path = '%kernel.root_dir%/../web/uploads') {
if (null === $file) {
return;
}
$name = $file->getClientOriginalName();
$file->move(
$path, $name
);
unset($file);
}
表格"ArchivoType.php"
<?php
namespace SisEvo\UploadBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
class ArchivoType extends AbstractType {
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('file', 'file')
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => 'SisEvo\UploadBundle\Entity\Archivo'
));
}
}
控制器"UploadController.php"
class UploadController extends Controller {
/**
* @Route("/file_upload/" , name = "file_upload")
*/
public function probarAction() {
$request = $this->getRequest();
$file = new Archivo();
$formulario = $this->createForm(new ArchivoType());
$formulario->handleRequest($request);
if ($formulario->isValid()) {
$em = $this->getDoctrine()->getManager();
$data = $formulario->getData();
$fileUploaded = $data->getFile();
$file->upload($fileUploaded);
echo "SUCCESS!";
}
return $this->render("upload/prova.html.twig"
, array("formulario" => $formulario->createView())
);
}
}
问题
如果文件夹/uploads
不存在,这段代码可以正常工作;这是我第一次使用它,但 Symfony 在以下时间显示此错误:
Unable to create the "%kernel.root_dir%/../web/uploads" directory
而这个错误是在vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/File/File.php的第110行
的这段代码中产生的if (!is_dir($directory)) {
if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) {
throw new FileException(sprintf('Unable to create the "%s" directory', $directory));
}
} elseif (!is_writable($directory)) {
throw new FileException(sprintf('Unable to write in the "%s" directory', $directory));
Symfony 似乎找不到 uploads
文件夹。
我尝试使用 chmod 777 -R 更改权限,但问题仍然存在。
有解决这个问题的想法吗?
提前致谢:)
编辑更多信息
第一
我正在创建一个服务来从我的应用程序的任何部分上传文件,所以我创建了一个包含实体和简单表单的包。上面的controllerpost只是一个证明,当uploadBundle
完成后,这个controller会被删除,upload方法会用在我需要的应用程序的各个部分。
此外,将每个上传文件的信息存储在数据库中的代码尚未开发。
拜托,你能解释一下为什么我的架构不对吗?谢谢:)
第二
Chmod
从 symfony 内核获取八进制 777; 问题部分的代码post来自symfony。
第三
你是对的,代码并不像我预期的那样工作。它在 web 文件夹中创建一个文件夹,如下所示:web/web/uploads
。我需要获得有关 Symfony 内部文件夹的更多信息。无论如何,@pablo 的回答解决了我的问题。
您获取 $path (kernel.root_dir) 的方式是错误的
试试这个方法:
public function probarAction() {
$request = $this->getRequest();
$file = new Archivo();
$formulario = $this->createForm(new ArchivoType());
$formulario->handleRequest($request);
if ($formulario->isValid()) {
$em = $this->getDoctrine()->getManager();
$data = $formulario->getData();
$fileUploaded = $data->getFile();
$path = $this->get('kernel')->getRootDir() . '/../web/uploads';
$file->upload($fileUploaded, $path);
echo "SUCCESS!";
}
return $this->render("upload/prova.html.twig"
, array("formulario" => $formulario->createView())
);
}
如果您有一些进展,请告诉我们
问候
添加了基于@Isaac 评论的文档链接:
获取 $path 的更有效方法:
$this->getParameter('kernel.root_dir') . '/../web/uploads';