Welcome to the Cookbook

loading...

7.3.4 Campos do tipo File(Arquivo)

Para adicionar campos do tipo arquivo (file), você primeiro deve se certificar que o formulário está definido como "multipart/form-data". Para isso crie o seu formulário usando uma dessas formas abaixo.

echo $form->create('Arquivo', array('enctype' => 'multipart/form-data') );

// OUTRA ALTERNATIVA

echo $form->create('Arquivo', array('type' => 'file'));
  1. echo $form->create('Arquivo', array('enctype' => 'multipart/form-data') );
  2. // OUTRA ALTERNATIVA
  3. echo $form->create('Arquivo', array('type' => 'file'));

Em seguida, adicione uma das duas linhas ao seu arquivo de exibição do formulário.

echo $form->input('Arquivo.file', array('between'=>'<br />','type'=>'file'));

// ou

echo $form->file('Arquivo.file');
  1. echo $form->input('Arquivo.file', array('between'=>'<br />','type'=>'file'));
  2. // ou
  3. echo $form->file('Arquivo.file');

Devido a limitações do próprio HTML não é possível adicionar valores nos campos do tipo arquivo (file). Cada vez que o formulário for exibido o seu valor sempre será vazio (em branco).

Após o envio, os campos do tipo arquivo (file) mostram um array com os dados para o script que recebe os dados do formulário.

Para o exemplo acima, os valores enviados sempre estará organizado da forma como mostrado abaixo. O caminho físico do arquivo na variável 'tmp_name' pode váriar de acordo com o sistema operacional usado pelo CakePHP.

$this->data['Arquivo']['file'] = array(
    'name' => nome_do_arquivo.pdf
    'type' => application/pdf
    'tmp_name' => C:/WINDOWS/TEMP/php1EE.tmp
    'error' => 0
    'size' => 41737
);
  1. $this->data['Arquivo']['file'] = array(
  2. 'name' => nome_do_arquivo.pdf
  3. 'type' => application/pdf
  4. 'tmp_name' => C:/WINDOWS/TEMP/php1EE.tmp
  5. 'error' => 0
  6. 'size' => 41737
  7. );

Esse array é gerado automaticamente pelo próprio PHP. Para mais detalhes sobre os dados de arquivo passados pelo PHP leia a documentação no site oficial do PHP.

7.3.4.1 Validando Uploads

Abaixo é um exemplo do método de validação que você pode definir no seu model para validar se um arquivo foi enviado com sucesso.

// Baseado no comentário 8 de: http://bakery.cakephp.org/articles/view/improved-advance-validation-with-parameters

function isUploadedFile($params){
	$val = array_shift($params);
	if ((isset($val['error']) && $val['error'] == 0) ||
	(!empty($val['tmp_name']) && $val['tmp_name'] != 'none')) 
	{
		return is_uploaded_file($val['tmp_name']);
	} else {
		return false;
	}
} 
  1. // Baseado no comentário 8 de: http://bakery.cakephp.org/articles/view/improved-advance-validation-with-parameters
  2. function isUploadedFile($params){
  3. $val = array_shift($params);
  4. if ((isset($val['error']) && $val['error'] == 0) ||
  5. (!empty($val['tmp_name']) && $val['tmp_name'] != 'none'))
  6. {
  7. return is_uploaded_file($val['tmp_name']);
  8. } else {
  9. return false;
  10. }
  11. }