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?
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();
}
}
}
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.
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?
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,
));
}
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???
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?
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?
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.
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.
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