文件上传到Application文件夹 - Zend框架3

时间:2017-05-10 11:42:30

标签: php zend-framework zend-framework3

我想将表单中的文件上传到我的Application文件夹(public / img / clientes /) 我的表单文件上传字段:

$this->add(array(
        'name' => 'foto',
        'attributes' => array(
            'type'  => 'file',
        ),
        'options' => array(
            'label' => 'Logo da empresa:',
        ),
    ));

我在控制器上的添加动作功能:

public function addAction()
{

    $form = new ClienteForm();


    if ($this->getRequest()->isPost()) {


        $data = $this->params()->fromPost();

        $form->setData($data);
        if ($form->isValid()) {
            $data = $form->getData();

            $name = $data['foto'];
            if(isset($name)){
                if(!empty($name)){
                    $location = __DIR__."../../../public/img/clientes/";
                    if(!move_uploaded_file($name, $location)){
                        return $this->redirect()->toRoute('home');
                    }
                }
            }
            $this->clienteManager->addNewCliente($data);

            return $this->redirect()->toRoute('clientes');
        }
    }
    return new ViewModel([
        'form' => $form
    ]);
}

我无法找到不工作的理由
如果有人能帮我解决这个问题,我将非常感激。

1 个答案:

答案 0 :(得分:3)

希望这里的一切都是自我描述的。只是上传位置有点奇怪。由于每个请求都由ZF通过index.php处理,并且此文件使用chdir(dirname(__DIR__))方法转到上一级,因此所有内容都与应用程序根相关。这就是为什么我们可以直接访问public/img/clientes,在这种情况下。但是建议通过module.config.php中的配置进行设置。并使用ServiceManager使其可用。

确保上传目录拥有正确的权限。

...

if ($this->getRequest()->isPost()) {

    // Merge data thus
    $data = array_merge_recursive(
        $this->getRequest()->getPost()->toArray(),
        $this->getRequest()->getFiles()->toArray()
    );

    $form->setData($data);

    if ($form->isValid()) {

        $data = $form->getData();

        // Upload path
        $location = "public/img/clientes/";

        // A bit validation of uploaded file
        $allowedExtension = array('jpg', 'jpeg', 'png');

        $extension = explode('.', $data['foto']['name']);
        $extension = end($extension);
        $fileName = time() . '.' . $extension;

        // Check if everything is OK!
        if (0 === $data['foto']['error'] && in_array($extension, $allowedExtension)) {
            move_uploaded_file($data['foto']['tmp_name'], $location . $fileName);
        } else {
            echo 'Something went wrong!';
        }
    }
}

...