Tenho q gravar imagens em campos blob, queria limitar o tamanho, vi só uma dica no forum q verifica o tamanho do arquivo no disco.
Se tivesse essa opção nas propriedades do campo como tem a extensão ficaria legal.
Eloy
Melhor do q LIMITAR seria fazer com q seu progr de uma RESIZE.
Esse código foi colocado no forúm pelo Rodrigo Araujo (rrma).
(Ainda nao testei)
Ele serve para reduzir forçadamente as imagens que um usuário coloque via formulário para assim não haver desperdicio de espaço em disco no servidor e tempo de upload.
Ele faz o seguinte:
- Filtra o tipo de imagem (ainda pela extensão, não pelo mime-type) no onValidate;
- Redimensiona as imagens gravadas para uma largura configurável e altura proporcional, para não haver distorção;
- Renomeia as imagens inseridas, aplicando uma padronização;
- Atualiza a tabela com os novos nomes de arquivo padronizados.
No sistema que ele usou, havia uma tabela com 2 campos “imagem (nome de arquivo)”. Usou os eventos onValidate, onAfterUpdate e onAfterInsert.
As rotinas estão usando os nomes de campo imagem1 e imagem2.
Código no onValidate do form:
$foto1_nome = {imagem1};
$foto1_extensao = end(explode(".", $foto1_nome));
$foto2_nome = {imagem2};
$foto2_extensao = end(explode(".", $foto2_nome));
if ($foto1_extensao != “jpg” || $foto2_extensao != “jpg”)
{
sc_error_message("Apenas imagens JPG são permitidas
");
sc_error_exit();
}
Código no onAfterUpdate e onAfterInsert do form:
#O campo “subdiretório” na definição dos campos no SC, estão com o seguinte conteúdo: “/fotos/{quadra}/{inscricao_cadastral}/”
#$pasta é o caminho absoluto das imagens
#maxdim é o valor da largura em px para o redimensionamento das imagens
$pasta = “/var/www/gcmweb/_lib/file/img/fotos/”.{quadra}."/".{inscricao_cadastral}."/";
$maxdim=400;
if (strlen(trim({imagem1})) > 0)
{
$foto1_nomeold = {imagem1};
$foto1_extensao = end(explode(".", $foto1_nomeold));
$foto1_nomenew = {inscricao_cadastral}."_foto1.".$foto1_extensao;
$foto1_caminhocompleto_old = $pasta.$foto1_nomeold;
$foto1_caminhocompleto_new = $pasta.$foto1_nomenew;
list($larg_orig, $alt_orig) = @getimagesize($foto1_caminhocompleto_old);
if ($larg_orig > $maxdim)
{
#Se a largura for maior que maxdim
$razao_orig = $larg_orig/$alt_orig;
$alt = $maxdim/$razao_orig; #Define a altura proporcional à largura
$larg = $maxdim;
$imagem_nova1 = imagecreatetruecolor($larg, $alt); #Cria o objeto imagem
$imagem1 = @imagecreatefromjpeg($foto1_caminhocompleto_old); #Carrega o arquivo
@imagecopyresampled($imagem_nova1, $imagem1, 0, 0, 0, 0, $larg, $alt, $larg_orig, $alt_orig); #Redimensiona
@imagejpeg($imagem_nova1, $foto1_caminhocompleto_new); #Salva com novo nome
unlink($foto1_caminhocompleto_old); #Apaga arquivo com nome antigo
}
else
{
#Se a imagem for menor ou igual a maxdim, apenas padronizo o nome
rename($foto1_caminhocompleto_old, $foto1_caminhocompleto_new);
}
sc_exec_sql(“UPDATE LOT1600 SET imagem1 = '” . $foto1_nomenew . “’ WHERE inscricao_cadastral = ‘{inscricao_cadastral}’”);
}
if (strlen(trim({imagem2})) > 0)
{
$foto2_nomeold = {imagem2};
$foto2_extensao = end(explode(".", $foto2_nomeold));
$foto2_nomenew = {inscricao_cadastral}."_foto2.".$foto2_extensao;
$foto2_caminhocompleto_old = $pasta.$foto2_nomeold;
$foto2_caminhocompleto_new = $pasta.$foto2_nomenew;
list($larg_orig, $alt_orig) = @getimagesize($foto2_caminhocompleto_old);
if ($larg_orig > $maxdim)
{
$razao_orig = $larg_orig/$alt_orig;
$alt = $maxdim/$razao_orig;
$larg = $maxdim;
$imagem_nova2 = imagecreatetruecolor($larg, $alt);
$imagem2 = @imagecreatefromjpeg($foto2_caminhocompleto_old);
@imagecopyresampled($imagem_nova2, $imagem2, 0, 0, 0, 0, $larg, $alt, $larg_orig, $alt_orig);
@imagejpeg($imagem_nova2, $foto2_caminhocompleto_new);
unlink($foto2_caminhocompleto_old);
}
else
{
rename($foto2_caminhocompleto_old, $foto2_caminhocompleto_new);
}
sc_exec_sql(“UPDATE LOT1600 SET imagem2 = '” . $foto2_nomenew. “’ WHERE inscricao_cadastral = ‘{inscricao_cadastral}’”);
}
Boa noite Eloy,
Discutirei sua sugestão com nossa equipe.
att,
Bernhard Bernsmann
Prezados, usei o código acima e funcionou perfeitamente. Porém, apresenta uma mensagem de erro quando vai redimensionar a imagem:
Variável não definida “skeepimage”.
Alguem sabe se tem como cada usuario somente ter 500mb de espaço para enviar arquivos tipo limitar ele apos ele enviar ate 500mb de arquivos ?
Evite cross-posting. Já postaste em outro lugar e já foi respondido.
E esse exemplo antigo funciona sim.