Upload De Imagem Com Insert No Banco

Bom dia pessoal

To precisando de uma ajuda. Preciso fazer um esquema q não sei nem como começar a pensar… pelo menos um pontapé inicial.

Eu tenho uma tabela produtos e uma tabela imagens (1 para Muitos). Criei um form com um combo onde eu escolho o produto para o qual quero vincular uma imagem e um campo file onde eu escolho a imagem.

Bom… isso até minha tia de 750 anos faz. Mas e daí pra frente? Como eu capturo essa imagem e gravo o nome dela na tabela imagem junto com o id do produto? Preciso fazer tratamentos nessa imagem (tamanho, marca d’água, renomear etc). Queria usar a classe do verot.net… coloquei a classe na pasta extensions. No arquivo main.php adicionei a pasta extensions no import. É isso mesmo?

Como eu faço tudo isso… tô viajando!!!

Thanks pela força!

Fábio,

Ta certo, usa o import() para chamar a class.

Vou postar um exemplo de como eu uso, ai depois você pode melhorar.




Yii::import('application.extensions.upload.Upload');


if($_FILES['img']['name'][0] != ""){


	// as it is multiple uploads, we will parse the $_FILES array to reorganize it into $files

	$imgs = array();

	foreach ($_FILES['img'] as $k => $l) {

		foreach ($l as $i => $v) {

			if (!array_key_exists($i, $imgs)) 

				$imgs[$i] = array();

			$imgs[$i][$k] = $v;

		}

	}


	// now we can loop through $files, and feed each element to the class

	foreach ($imgs as $img) {

		set_time_limit(0);

		// we instanciate the class for each element of $file

		$imagem = new Upload($img, 'pt_BR');

		

		// then we check if the file has been uploaded properly

		// in its *temporary* location in the server (often, it is /tmp)

		if ($imagem->uploaded) {




			$imagem->allowed = array('image/*');

			$imagem->file_new_name_body = 'imagem_grande_'.time();

			//$imagem->image_x = 300;

			//$imagem->image_y = 100;

			$imagem->image_ratio_y = true;

			

			//MARCA DAGUA

//			$imagem->image_watermark = 'img/watermark.png';

			//POSICOES DA MARCA DAGUA

//			$imagem->image_watermark_x = -10;

//			$imagem->image_watermark_y = -10;	

		  

			$imagem->Process($dataFolder);

			if ($imagem->processed) {

				echo 'ok';

			} else { 

				echo $imagem->error;

			}

			

			$imagem->clean();

		} 

	}

}



Ai você cria os campos usando o name = img[]




Imagem 01:

<input type="file" name="img[]"/>


Imagem 02

<input type="file" name="img[]"/>


Imagem 03

<input type="file" name="img[]"/>



Fala Newerton

Primeiro, muito obrigado pelas instruções. Já consigo ver as coisas agora (eu tava completamente cego). Só tem uma coisa que não sei o que to fazendo de errado: no envio do form, eu estou recebendo a imagem como um array e não o nome. Daí, claro, diz q o formato é inválido. Quando eu tiro o ‘[]’ do img no name do form, passa certinho, mas dá erro no foreach. Onde q eu to vacilando??? A princípio estou testando com uma imagem apenas.

Vlw mais uma vez.

Opa Fábio, blz?

Mas neste array não está contido o nome da imagem?

Posta ai um exemplo do array que você tá recebendo.

abraço

Ele tá passando a palavra Array. Quando eu dou um echo pra checar o comportamento do código, ele escreve Array na tela. Se eu tiro os colchetes de img (no form), dá certo e passa a imagem com a extensão certinho, mas daí para no foreach (dá erro). Eu coloquei o código dentro o actionCreate… é isso mesmo né?

E só mais uma coisinha: o $dataFolder é onde serão salvas as imagens?

Fábio,

Ao invés de usar o echo, usa o print_r() ou var_dump() que os resultados do array irão aparecer!

Sobre o $dataFolder, sem querer apaguei a váriavel, mais é a pasta onde será salvo a imagem.

Oi Newerton

Usei o var_dump() e parece que está passando certo. Olha como printou o resultado:

=============================================

array

0 => string ‘imagem-1.jpg’ (length=17)

1 => string ‘imagem-2.jpg’ (length=17)

=============================================

Mas dá a seguinte mensagem: "Tipo de arquivo incorreto.Tipo de arquivo incorreto."

Eu até olhei no código da classe, mas parece tudo ok. Não to conseguindo ver o problema. Vlw pela força!!!

Já testou com outras imagens?

Posta seu código aqui.

To até com medo de postar o código e ser um erro grotesco (provavelmente)… rsrs. Mas vamos lá… Esse código é o da functionCreate


	public function actionCreate()

	{

		$model=new Imagem;


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Imagem']))

		

		{


		Yii::import('application.extensions.Upload');

				if($_FILES['imagem']['name'][0] != ""){


        // as it is multiple uploads, we will parse the $_FILES array to reorganize it into $files

        $imgs = array();

        foreach ($_FILES['imagem'] as $k => $l) {

                foreach ($l as $i => $v) {

                        if (!array_key_exists($i, $imgs)) 

                                $imgs[$i] = array();

                        $imgs[$i][$k] = $v;

                }

        }


        // now we can loop through $files, and feed each element to the class

        foreach ($imgs as $img) {

                set_time_limit(0);

                // we instanciate the class for each element of $file

                $imagem = new Upload($img, 'pt_BR');

                

                // then we check if the file has been uploaded properly

                // in its *temporary* location in the server (often, it is /tmp)

                if ($imagem->uploaded) {




                        $imagem->allowed = array('images/*');

                        $imagem->file_new_name_body = 'imagem_grande_'.time();

                        //$imagem->image_x = 300;

                        //$imagem->image_y = 100;

                        $imagem->image_ratio_y = true;

                        

                        //MARCA DAGUA

//                      $imagem->image_watermark = 'img/watermark.png';

                        //POSICOES DA MARCA DAGUA

//                      $imagem->image_watermark_x = -10;

//                      $imagem->image_watermark_y = -10;       

                  		

			$dataFolder = 'images/';

                        $imagem->Process($dataFolder);

                        if ($imagem->processed) {

                                echo 'ok';

                        } else { 

                                echo $imagem->error;

                        }

                        

                        $imagem->clean();

                } 

        }

}

			$model->attributes=$_POST['Imagem'];

			if($model->save())

			{				

				//$this->redirect(array('view','id'=>$model->id));

			}

		}


		$this->render('create',array(

			'model'=>$model,

		));

	}

E esse são os inputs do form:


    <div class="row">

		<?php echo $form->labelEx($model,'imagem'); ?>

		<?php echo '<input type="file" name="imagem[]"/>'; ?>

		<?php echo $form->error($model,'imagem'); ?>

	</div>

    

    <div class="row">

		<?php echo $form->labelEx($model,'imagem'); ?>

		<?php echo '<input type="file" name="imagem[]"/>'; ?>

		<?php echo $form->error($model,'imagem'); ?>

	</div>

Fábio,

Visualmente ta correto, só achei uma chave a mais no código, dei uma enxugada no código, para ser o mais simples para testar.




public function actionCreate()

{

	$model=new Imagem;


	Yii::import('application.extensions.Upload');

	

	if($_FILES['imagem']['name'][0] != ""){


		$imgs = array();

		foreach ($_FILES['imagem'] as $k => $l) {

			foreach ($l as $i => $v) {

				if (!array_key_exists($i, $imgs)) 

						$imgs[$i] = array();

				$imgs[$i][$k] = $v;

			}

		}


        foreach ($imgs as $img) {

			set_time_limit(0);


			$imagem = new Upload($img, 'pt_BR');

			

			if ($imagem->uploaded) {


				$dataFolder = Yii::app()->baseUrl . '/images/';

				$imagem->Process($dataFolder);

				if ($imagem->processed) {

					echo 'original image copied';

				} else { 

					echo 'error : ' . $foo->error;

				}

				

				$imagem->clean();

			} 

        }

	}

	

	$model->attributes=$_POST['Imagem'];

	if($model->save()){                               

		//$this->redirect(array('view','id'=>$model->id));

	}

		

	$this->render('create',array(

			'model'=>$model,

	));

}



Opa… agora tá quase. As imagens passaram certinho, só não estão sendo movidas para o diretório. Retorna o echo original image copied, mas as imagens não aparecem no diretório. Dei um echo no $dataFolder: /Vitrine-Project/admin/images/ … e esse diretório existe! O que pode ser???

Fábio,

Vai testando com o:




...

$dataFolder = 'images/';

var_dump(is_dir($dataFolder));

exit();

$imagem->Process($dataFolder);

...



Ai você vai alterando a pasta colocando ../ até encontrar a pasta correta, quando der tudo certo o var_dump() vai retornar true.

Nossa cara… tem alguma coisa muito estranha acontecendo. Fiz esse teste e retorna true, mas as imagens não copiam. Então resolvi fazer um teste criando novos diretórios. Resultado: false.

Achei estranho e comecei a mudar os diretório, apontando inclusive para o css, assets, protected etc. Além dos que eu criei.

Conclusão… apenas o diretório com o nome de images retorna true. Qualquer outra alternativa retorna false. Isso não é estranho?

Veja:




$dataFolder1  = Yii::app()->baseUrl . '/images/';

$dataFolder2  = Yii::app()->baseUrl . '/imagess/';




echo $dataFolder1.'<br />';

echo $dataFolder2.'<br />';

								


var_dump(is_dir($dataFolder1));

var_dump(is_dir($dataFolder2));

								


exit();

O resultado




/Vitrine-Project/admin/images/

/Vitrine-Project/admin/imagess/


boolean true


boolean false



Se eu trabalhar só com uma variável dá na mesma, ou se inverter a ordem também. Já tentei de tudo. Só aceita o nome images no diretório. IMPORTANTE: estou fazendo esse teste antes da rotina de upload iniciar. O problema parece estar além do código. Como posso depurar isso?

Ta usando Windows ou Linux?

Posta o caminho completo onde está o arquivo que faz upload!

Por exemplo, caso seja windows:

e:\www\nomedoprojeto\protected\controller\NoticiaController.php

As pasta dentro do /protected/ não tem como o usuário externo acessar caso esteja fazendo upload de imagem.

O correto e colocar fora da /protected, como é feito com o assets, fora do /protected cria a pasta /images

Ai você direciona as imagens para:


Yii::app()->baseUrl . '/images/';

É windows. O caminho completo é:


c:\wamp\www\Vitrine-Project\admin\images\

O esqueleto do yii está em admin e a pasta images fora do /protected

No teste do var_dump() retorna true, mas se eu mudar o nome da pasta (mudando também no $dataFolder), retorna false.

Caros, bom dia, tenho um gerenciador completo de galerias integrado à minha CMS (que chamo de df9 CMS). Criei um behavior que permite anexar galerias a qualquer model, inclusive com gerenciamento visual integrado também (ou seja, você não precisa criar a interface, só declarar os behaviors no model e duas actions no controller, além de um botão para linkar para a tela de adm das galerias)

Permite também o upload de arquivos anexos (coisas diferentes de imagens, como documentos), tudo parametrizável. Grava os arquivos no disco e as informações sobre ele no banco de dados (tamanho, width e height se for imagem, data de criação, pathalias e outras)

Exemplo:

  • Eventos podem ter várias galerias

  • Produtos podem ter várias galerias

  • Qualquer_model pode ter várias galerias

Algumas características implementadas:

  • Cadastro e upload de fontes personalizadas para escrever textos

  • Cadastro de marcas dágua personalizadas

  • Cadastro de padrões de texto (como escrever textos nas imagens, tamanho, fonte utilizada)

  • Cadastro de padrões de galerias (qual marca dágua utilizar, qual padrão de texto, tamanhos das imagens)

  • Ordenação visual de imagens

  • Suporta 3 tamanhos de imagens e resoluções diferentes para cada tamanho

  • Não aplica marca dágua em thumbnails automaticamente

  • Suporte para qualquer tipo de arquivo com checagem de mimetype e extensão configurado por galeria

  • Possui escolha de aplicar ou não a marca dágua e textos individualmente por arquivo na hora do upload

  • Possui métodos para recuperar todos os arquivos associados

  • Função para vídeos externos (com parâmetros de aceitação de rede - youtube, vimeo etc)

  • Integrado a um visualizador de imagens atual, com implementação de compartilhamento em redes com o addthis

  • Grupos de galerias

  • Internacionalizado

Eu ia liberar para download nas extensions o sistema completo, mas como não estava com muito tempo para atender as solicitações de ajuda que certamente virão, deixo aqui para os interessados, se quiserem ver como está funcionando, eu hospedo no meu servidor um teste e passo para vocês login/senha.

Para poder liberar nas extensões eu precisaria da ajuda (e generosidade/paciência) de alguém interessado para montar um vídeo-tutorial de como utilizar a galeria, pois apenas com texto fica muito difícil mostrar o negócio completo.

:)

Abraços!

Junior, o seu Gerenciador parece ser algo que caiu do céu! :D

Posta aí pô. Acho que ele vai ajudar muita gente.

Quanto as dúvidas, a gente vai fuçando e ajudando um ou outro.

Lothor, vou postar sim. Só vou fazer um teste de integrá-lo a um skeleton do Yii para garantir que vai funcionar de primeira nas máquinas da maioria do pessoal, pois, até o momento, só utilizei o módulo integrado na minha própria CMS e eu uso várias extensões e algumas delas eu precisei modificar para funcionar.

:)

Abraços

Ola meus carosja vi muita coisa em cima sobre imagem mas so que eu tenho uma tabela alunos com um campo que e imagem e esse campo faz upload de uma imagem ja coloquei o campo no _form

<div class="row">

            &lt;?php echo &#036;form-&gt;labelEx(&#036;model,'imagem'); ?&gt;


            &lt;?php echo '&lt;input type=&quot;file&quot; name=&quot;imagem[]&quot;/&gt;'; ?&gt;


            &lt;?php echo &#036;form-&gt;error(&#036;model,'imagem'); ?&gt;


    &lt;/div&gt;

mas acho que tem mais coisa a fazer porque a imagem não esta a ser guardada na base de dados.

obrigado

Olá Jair, como está a sua ação que recebe o Formulário?

Em seu formulário você adicionou o atributo enctype="multipart/form-data" a TAG <form> né?