Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou tentando fazer um form com upload de arquivos mas não está funcionando. Ele não carrega os arquivos e nem indica os erros.
Controler: Noticias.php
public function CriarNoticia () {
//carrega a blibioteca
$this->load->library('upload');
//verifica nível de acesso
if ($this->session->userdata('nivel') < 4) {
//redireciona página
header("Location: ".base_url()."Principal");
}
//zera variáveis
$erro = '';
//cria objeto
$noticia = new Noticia;
//valida campos do form
$this->form_validation->set_rules('titulo','Título','required');
$this->form_validation->set_rules('data','Data','required');
$this->form_validation->set_rules('texto','Texto','required');
$this->form_validation->set_rules('resumo','Resumo','required');
$this->form_validation->set_rules('categoria','Categoria','required');
//verifica validação
if ($this->form_validation->run() == TRUE){
//atribui valor do form para variável
$noticia->__set('titulo', $this->input->post('titulo'));
$noticia->__set('data', $this->input->post('data'));
$noticia->__set('texto', $this->input->post('texto'));
$noticia->__set('resumo', $this->input->post('resumo'));
$noticia->__set('categoria', $this->input->post('categoria'));
//configura arquivos
$config['upload_path'] = './galeria/imagensdestaque';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_width'] = '500';
$config['overwrite'] = 'true';
//inicializa as configurações
$this->upload->initialize($config);
// faz o upload
if ( ! $this->upload->do_upload('imagem')) {
// em caso de erro retorna os mesmos para uma variável
$erro = array('error' => $this->upload->display_errors());
} else {
//se correu tudo bem, recuperamos os dados do arquivo
$imagem['dadosArquivo'] = $this->upload->data();
// definimos o caminho original do arquivo
$arquivoPath = 'imagensdestaque/'.$imagem['dadosArquivo']['file_name'];
// passando para o array
$imagem['urlArquivo'] = base_url($arquivoPath);
}
$noticia->__set('imagem', $imagem['urlArquivo']);
//cria objeto
$crud = new Crud2;
//prepara dados
$resultado = array('Titulo' => $noticia->titulo, 'Data' => $noticia->data, 'Texto' => $noticia->texto, 'Resumo' => $noticia->resumo, 'Categoria' => $noticia->categoria, 'Imagem' => $noticia->imagem);
//salva dados
$crud->Inserir('noticias', $resultado);
} else {
//indica os erros
$erro = validation_errors('<p class="vermelho">','</p>');
}
//coloca dados em array para transmitir a vista
$dados = array (
'menu' => 'padroes/menu',
'pagina' => 'InserirNoticia',
'rodape' => 'padroes/Rodape',
'erro' => $erro
);
//carrega vista
$this->load->view('Padroes/PaginaPadrao',$dados);
}
View: InserirNoticia.php
<div class="container">
<div class="row">
<div class="col-sm-10">
<H2>Cadastrar Notícia</H2>
<fieldset>
<p><?php echo form_open('Noticias/CriarNoticia'); ?></p>
<label>Título:</label>
<p><?php echo form_input(array('name'=>'titulo','id'=>'titulo'),set_value('titulo')); ?></p>
<label>Data:</label>
<p><?php echo form_input(array('type'=>'date', 'name'=>'data','id'=>'data'),set_value('data')); ?></p>
<label>Texto: </label>
<p><?php echo form_textarea(array('name'=>'texto','id'=>'texto'),set_value('texto')); ?></p>
<label>Resumo: </label>
<p><?php echo form_input(array('name'=>'resumo','id'=>'resumo'),set_value('resumo')); ?></p>
<label>Imagem de Destaque: </label>
<p><?php echo form_input(array('type'=>'file', 'name'=>'imagem','id'=>'imagem'),set_value('imagem')); ?></p>
<label>Categoria: </label>
<p><?php echo form_dropdown(array('name'=>'categoria','id'=>'categoria'), array('noticia' => "Notícia"), set_value('categoria')); ?></p>
<label> </label>
<p><?php echo form_submit(array('name'=>'cadastrar'),"Cadastrar"); ?></p>
</form>
<label> </label>
</fieldset>
<?php echo $erro; ?>
</div>
</div>
</div>Sim o form_validation está carregado.
Quanto ao erro o único erro que ele dá é esse:
>
Citar
A PHP Error was encountered
Severity: Notice
Message: Undefined variable: imagem
Filename: controllers/Noticias.php
Line Number: 101
onde a linha 101 = a esta: $noticia->__set('imagem', $imagem['urlArquivo']);
>
2 horas atrás, marcelobbt disse:
Sim o form_validation está carregado.
Quanto ao erro o único erro que ele dá é esse:
onde a linha 101 = a esta: $noticia->__set('imagem', $imagem['urlArquivo']);
Essa variável **$imagem** não deveria ter sido iniciada como caracter logo no início do código? Essa variável **$imagem** tem que ser do tipo caracter para poder armazenar uma informação de link de URL.Se eu colocar um valor inicial na variável simplesmente não aparecerá este erro mas continuará não funcionando o upload.
Eu fiz um teste e no servidor está funcionando.
Ele só não está gravando no meu PC. Creio que é problema de permissão de gravação na pasta, mas como ajusto isso no PC?
Aonde você está querendo mexer nas permissões? Qual sistema operacional é? Dependendo do sistema é diferente.
Verdade.
Esqueci do básico. Windows 10.
Clique com o botão direito na pasta, escolha "propriedades".
Vá na aba "segurança", botão "Editar..." e nessa tela você escolhe um usuário para ter permissão de escrita, se você não se importa com sua pasta, somente adicione o usuário "Todos", mas você deveria somente dar permissões aos usuários que interessa, de um ponto de vista de administrador de sistemas.
Isso eu fiz mas continua sem salvar o arquivo.
Deve ter algum erro no código mas não consigo enxergar.
Esse **$this** no seu código está sendo usado de forma correta? nos exemplos que vi do $this na internet, ele direciona o conteúdo de &this para dentro de outra variável como por exemplo {$var} em:
[https://stackoverflow.com/questions/16408037/php-this-var-what-does-that-mean](https://stackoverflow.com/questions/16408037/php-this-var-what-does-that-mean)
[http://respostas.guj.com.br/51499-this-em-php-como-funciona](http://respostas.guj.com.br/51499-this-em-php-como-funciona)
[http://excript.com/php/pseudo-variavel-this-php.html](http://excript.com/php/pseudo-variavel-this-php.html)
(eu estou estudando PHP, mas ainda sei muito pouco de PHP).Tenho um livro de Javascript, nele diz que o this quando é adicionado em um local onde especificamos uma propriedade, informamos ao JavaScript que queremos obter a propriedade deste objeto. Pode ser que no PHP ele funcione similar.
Basicamente o $this está fazendo referência a um Controller do CodeIgniter, um Framework de PHP. É bem comum ser utilizado e não acho que haja problemas nisso.
Tente mudar isto:
$config['upload_path'] = './galeria/imagensdestaque';
"." é o diretório atual, mas talvez isto seja melhor como:
$config['upload_path'] = BASEPATH . '/galeria/imagensdestaque';
Tente ver aonde essa variável está apontando, ele provavelmente vai dar o caminho completo desde o "C:\".Já tentei mudar diversas vezes o caminho da pasta. Já tentei colocar o caminho completo, colocar apenas uma pasta na raiz, dentro da aplicação, enfim, de várias formas mas não ia.
Algum mistério tem que não consigo salvar o arquivo. Estou pesquisando uma outra forma de fazer isso.
Talvez ao invés de form_open() no html, você deva usar form_open_multipart().
"This function is absolutely identical to form_open() above, except that it adds a multipart attribute, which is necessary if you would like to use the form to upload files with."
https://www.codeigniter.com/userguide3/helpers/form_helper.html
No file uploading class do CodeIgniter também é feito com multipart:
https://www.codeigniter.com/userguide3/libraries/file_uploading.html
Funcionou.
Foi isso mesmo. Obrigado!
form_open_multipart()
@marcelobbt
Achei hoje este site, ele tem um código de upload de arquivos em PHP = http://blog.ultimatephp.com.br/upload-multiplo-php/
Bem, provavelmente você já fez isso, mas vou colocar o óbvio que sei:
$config['log_threshold'] = 4;.
Rode o upload uma vez, e veja os logs do CodeIgniter, ou se aparece algum erro.