文件上传到应用程序文件夹 - Zend framework 3

File Upload into the Application folder - Zend framework 3

我想将表单中的文件上传到我的应用程序文件夹 (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
    ]);
}

我找不到这不起作用的原因
如果有人能帮我解决这个问题,我将不胜感激。

希望这里的一切都是自我描述的。只是上传位置有点奇怪。由于每个请求都由 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!';
        }
    }
}

...