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