Upload De Imagem Com Insert No Banco Como eu capturo uma imagem e gravo o nome dela numa tabela?
#1
Posted 15 September 2012 - 08:26 AM
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!
#2
Posted 16 September 2012 - 09:17 AM
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[]"/>
--
http://newerton.com.br/
https://linkedin.com/in/newerton
https://github.com/newerton/
--
Por favor, para saber que você ficou satisfeito com a resposta, clicar no botão de

#3
Posted 17 September 2012 - 03:30 PM
Newerton, on 16 September 2012 - 09:17 AM, said:
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.
#4
Posted 18 September 2012 - 06:48 AM
Mas neste array não está contido o nome da imagem?
Posta ai um exemplo do array que você tá recebendo.
abraço
http://www.yiibrasil.com.br - Blog com dicas e tutoriais sobre o Yii Framework.
#5
Posted 18 September 2012 - 07:57 AM
Dyego Nery, on 18 September 2012 - 06:48 AM, said:
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?
#6
Posted 19 September 2012 - 07:49 AM
Fábio R.R, on 18 September 2012 - 07:57 AM, said:
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.
--
http://newerton.com.br/
https://linkedin.com/in/newerton
https://github.com/newerton/
--
Por favor, para saber que você ficou satisfeito com a resposta, clicar no botão de

#7
Posted 19 September 2012 - 11:11 AM
Newerton, on 19 September 2012 - 07:49 AM, said:
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!!!
#8
Posted 20 September 2012 - 07:48 AM
Posta seu código aqui.
--
http://newerton.com.br/
https://linkedin.com/in/newerton
https://github.com/newerton/
--
Por favor, para saber que você ficou satisfeito com a resposta, clicar no botão de

#9
Posted 20 September 2012 - 08:06 AM
Newerton, on 20 September 2012 - 07:48 AM, said:
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>
#10
Posted 20 September 2012 - 08:29 AM
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, )); }
--
http://newerton.com.br/
https://linkedin.com/in/newerton
https://github.com/newerton/
--
Por favor, para saber que você ficou satisfeito com a resposta, clicar no botão de

#11
Posted 20 September 2012 - 10:05 AM
Newerton, on 20 September 2012 - 08:29 AM, said:
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???
#12
Posted 20 September 2012 - 10:58 PM
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.
--
http://newerton.com.br/
https://linkedin.com/in/newerton
https://github.com/newerton/
--
Por favor, para saber que você ficou satisfeito com a resposta, clicar no botão de

#13
Posted 21 September 2012 - 06:25 AM
Newerton, on 20 September 2012 - 10:58 PM, said:
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?
#14
Posted 21 September 2012 - 08:53 AM
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/';
This post has been edited by Newerton: 21 September 2012 - 08:53 AM
--
http://newerton.com.br/
https://linkedin.com/in/newerton
https://github.com/newerton/
--
Por favor, para saber que você ficou satisfeito com a resposta, clicar no botão de

#15
Posted 21 September 2012 - 09:08 AM
Newerton, on 21 September 2012 - 08:53 AM, said:
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.
#16
Posted 01 October 2012 - 06:17 AM
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
df9.com.br
Linux Registered User #364954
GNU/Linux: together we're ready!
#17
Posted 03 October 2012 - 03:37 PM

Posta aí pô. Acho que ele vai ajudar muita gente.
Quanto as dúvidas, a gente vai fuçando e ajudando um ou outro.
#18
Posted 04 October 2012 - 05:08 AM

Abraços
Junior
df9.com.br
Linux Registered User #364954
GNU/Linux: together we're ready!
#19
Posted 24 October 2012 - 02:15 PM
<div class="row">
<?php echo $form->labelEx($model,'imagem'); ?>
<?php echo '<input type="file" name="imagem[]"/>'; ?>
<?php echo $form->error($model,'imagem'); ?>
</div>
mas acho que tem mais coisa a fazer porque a imagem não esta a ser guardada na base de dados.
obrigado
#20
Posted 24 October 2012 - 03:10 PM
Em seu formulário você adicionou o atributo enctype="multipart/form-data" a TAG <form> né?