如何解决 Symfony2 中的“无法创建“%kernel.root_dir%/../web/uploads”目录”错误

Posted

技术标签:

【中文标题】如何解决 Symfony2 中的“无法创建“%kernel.root_dir%/../web/uploads”目录”错误【英文标题】:How to solve "Unable to create the "%kernel.root_dir%/../web/uploads" directory" error in Symfony2 【发布时间】:2016-11-30 09:47:30 【问题描述】:

我正在使用捆绑包上传任何类型的文件。 为此,我创建了一个包含以下文件的新包 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;

此外,该实体包含getsetrequired 方法,最后还有一个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 显示此错误:

无法创建“%kernel.root_dir%/../web/uploads”目录

并且在第 110 行的 vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/File/File.php 中的这段代码中产生了错误

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 更改权限,但问题仍然存在。 有什么办法解决这个问题吗? 在此先感谢:)

编辑更多信息

第一 我正在创建一个服务来从我的应用程序的任何部分上传文件,所以我创建了一个包含实体和简单表单的包。上面的控制器帖子只是一个证明,当uploadBundle完成时,这个控制器将被删除,并且将在我需要的应用程序的每个部分使用上传方法。 此外,还没有开发将每个上传文件的信息存储在数据库中的代码。

拜托,你能解释一下为什么我的架构有问题吗?谢谢:)

第二次Chmod从symfony内核获取八进制777; 问题 部分中发布的代码来自 symfony。

第三 你是对的,代码不像我预期的那样工作。它在 web 文件夹中创建一个文件夹,如下所示:web/web/uploads。我需要获取有关 Symfony 内部文件夹的更多信息。无论如何,@pablo 的回答解决了我的问题。

【问题讨论】:

首先:你的架构很糟糕。不要将域逻辑放入实体中。 第二次chmod 获取八进制数作为参数,因此您需要将0777 传递给它。 第三:你确定这段代码能正常工作吗?这段代码制作文件夹?我为什么要问?因为我认为您的 File 实例对您的容器一无所知,所以它不知道它是什么 %kernel.root_dir% 嗨@MichaelSivolobov,我很欣赏你的评论;出于这个原因,我需要更多信息来改进我的代码,现在我将在主要帖子中回复您评论的每一部分;如果可以,请告诉我为什么我错了。提前谢谢你。 【参考方案1】:

你获取 $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 评论的文档链接:

Configuring the Kernel getRootDir specific documentation

获取 $path 的更有效方法:

$this->getParameter('kernel.root_dir') . '/../web/uploads';

【讨论】:

嗨@pablo,你的解决方案对我有用,谢谢。似乎我获得root dir 的方式是错误的。谢谢!!请您发布有关这些方法的任何官方文档$this-&gt;get('kernel')-&gt;getRootDir()。非常感谢:) 完成,如有问题请通知

以上是关于如何解决 Symfony2 中的“无法创建“%kernel.root_dir%/../web/uploads”目录”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Symfony2 和 Doctrine2 中的一个点保存和检索纬度和经度

Symfony2:如何手动登录用户? [复制]

如何解决在 aws 上打开 symfony2 安装时出现 403 Forbidden 错误?

如何在 Symfony2 中保存视图中的数据

如何访问 Symfony2 中的嵌套参数值?

如何访问 symfony2 中另一个 html.twig 文件中的 javascript 函数?