Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marcelobbt

Fazer upload de arquivo no codeigniter

Recommended Posts

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&iacute;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&iacute;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&iacute;cia"), set_value('categoria')); ?></p>
				<label>&nbsp;</label>
				<p><?php echo form_submit(array('name'=>'cadastrar'),"Cadastrar"); ?></p>
				</form>
				<label>&nbsp;</label>
			</fieldset>
			<?php echo $erro; ?>
		</div>
	</div>
</div>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, provavelmente você já fez isso, mas vou colocar o óbvio que sei:

 

1) Não vejo nesse código você carregando um $this->load->library("form_validation"), ele já está no autoload.php?

 

2) Coloque isso no começo do código para fazer o PHP exibir erros:

ini_set('display_errors', true);
error_reporting(E_ALL);

 

3) Mude a variável do arquivo de configuração do CodeIgniter que está no config.php:

$config['log_threshold'] = 0;

para:

$config['log_threshold'] = 4;.

Rode o upload uma vez, e veja os logs do CodeIgniter, ou se aparece algum erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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']);

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu colocar um valor inicial na variável simplesmente não aparecerá este erro mas continuará não funcionando o upload.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 

 

http://respostas.guj.com.br/51499-this-em-php-como-funciona

 

http://excript.com/php/pseudo-variavel-this-php.html

 

(eu estou estudando PHP, mas ainda sei muito pouco de PHP).

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:\".

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@marcelobbt

 

Achei hoje este site, ele tem um código de upload de arquivos em PHP = http://blog.ultimatephp.com.br/upload-multiplo-php/

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por clovis.sardinha
      Como fazer para colocar um spinner antes de carregar os dados do bd? Eu clico no link e entra na função do controle e só vai para a página da views quando já está pronto a query. Vi uns exemplos de colocação de spinner, mas se a página ainda não apareceu como faço? Vou anexar a função que chama a página para facilitar. 
      public function inativos()  {     $session = \Config\Services::session();     $pager = \Config\Services::pager();     $usuarios=$this->usuarios->getInativos();//faz a query no bd.     $dados=[         'usuarios'=>$usuarios,         'pager'=>$this->usuarios->pager,     ];     echo view('Admin/Relatorios/listaInativos',$dados); }   
    • Por AlexandreHenrique
      Olá pessoal. preciso de uma ajuda com o meu projeto de upload.
      O projeto de upload roda no IIS + Php;
      Tenho um script que ta enviando  o arquivo para o diretório correto.
      O problema é que ao tentar acessar esse arquivo via URL, o anexo não abre  e exibe a mensagem abaixo.
       

      Notei que o arquivo ao cair no DIR, ele entra sem permissões (vi em propriedades), se eu editar o mesmo alterando as permissões, ele carrega pela url do meu site.
      Quero que o arquivo enviado pelo script caia no DIR correta com as devidas permissões pra eu poder ler no navegador via URL;
       
      Já tentei resolver de toda forma mas nao tive sucesso;.
      No Apache isso é mais simples, mas no IIS ta complicado;
       
       
       
      Alguem pode me dá uma dica?
    • Por Caio Vargas
      Fala pessoa tudo tranquilo ?
      estou com um problema eu fiz um sistema de upload onde tem a marca dagua  o problema e que quando o cadastro da capa e pequena a imagem da marca dagua fica grande
      e qauando a capa e grande  a imagem da marca dagua fica pequena alguem poderia me ajudar 
    • Por mateus.andriollo
      Olá,
      Gostaria de saber se alguem pode me ajudar.
      Meu PHP esta na pasta public_html em um CPanel, quero saber se é possível armazenar em pasta fora da pasta  pública, por segurança mesmo...
      Faço isso em ASP, ai chamo a imagem por um fso, funciona mas queria saber se tem como no PHP.
    • Por DeniseAlencar
      Boar tarde pessoal estou fazendo um teste com upload de imagens gravando no banco de dados porem quando cadastro uma imagem com o nome "foto.jpg" e depois cadastro a mesma imagem com o mesmo nome, no banco de dados aparece dois registros com nomes iguais mas gostaria que os nomes fossem diferentes.
       
      E na pasta arquivos aparece uma unica imagem gostaria que quando cadastrasse fotos iguais o nome mudasse tipo foto.jpg , foto2.jpg  etc (isso automaticamente) vou postar o codigo .
      <?php $diretorio = "arquivos/"; if(!is_dir($diretorio)){ echo "Pasta $diretorio não existe";}else{ $arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE; for ($controle = 0; $controle < count($arquivo['name']); $controle++){ $destino = $diretorio."/".$arquivo['name'][$controle]; $nome_foto = $arquivo['name'][$controle]; if(move_uploaded_file($arquivo['tmp_name'][$controle], $destino)){ $sql="INSERT INTO galeria (arquivo) VALUES ('$nome_foto')"; $qry = mysqli_query($conexao,$sql); echo "<head><meta HTTP-EQUIV='refresh' CONTENT='0;URL=index.php'></head>"; }else{ echo "Erro ao realizar upload"; } } } ?>  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.