• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

xplode_me

Auto-incrementar nome ao fazer upload

19 mensagens neste tópico

Olá!

Tenho o seguinte problema:

Estou a fazer upload de uma imagem, que depois é redimensionada e enviada (2 tamanhos, o redimensionado e uma miniatura com 100px) para uma pasta.

O caminho é do estilo: galerias/$idgaleria/full ou para a miniatura galerias/$idgaleria/mini.

Eu preciso que na altura de renomear o ficheiro, ele descubra que imagens existem dentro da pasta, por exemplo full. Se não existir nada, a primeira imagem deve-se chamar 001.jpg.

A próxima a ser enviada 002.jpg e por aí adiante.

Alguém pode dar uma mãozinha? ;) Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Problema resolvido contando o numero de ficheiros existentes na pasta e adicionando 1. ;)

$nome = count(glob("../galerias/$idgaleria/full/*.*")) + 1;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não sei como fazer.. mas não me parece uma ideia muito eficiente.. imagina que tens 1 milhão de ficheiros ? Será que não há outra opção ? Guardar uma variável algures ? Num ficheiro por exemplo..  Tudo depende também da quantidade de imagens que estejas à espera de ter armazenado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não sei como fazer.. mas não me parece uma ideia muito eficiente.. imagina que tens 1 milhão de ficheiros ? Será que não há outra opção ? Guardar uma variável algures ? Num ficheiro por exemplo..  Tudo depende também da quantidade de imagens que estejas à espera de ter armazenado.

Exacto, e o glob vai retornar um array, coisa que gasta muita memória. Mais vale fazer um loop pela directoria e ir incrementando um contador.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta estilo isto:

$x=0;
while ( file_exists( '../galerias/'.$idgaleria.'/full/'.(++$x).$extensao ) );

não testei o código, mas deves ficar com o contador no número correcto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta estilo isto:

$x=0;
while ( file_exists( '../galerias/'.$idgaleria.'/full/'.(++$x).$extensao ) );

não testei o código, mas deves ficar com o contador no número correcto.

Ugly solution, sem contar que não vai verificar o 0.ext ;)

Adapta o exemplo #2 -> http://pt2.php.net/readdir

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ugly solution, sem contar que não vai verificar o 0.ext ;)

Adapta o exemplo #2 -> http://pt2.php.net/readdir

Depende dos gostos xD, mais directo ao problema que essa solução não tou a ver. E ele quer mesmo que comece do 1.ext.

Se não existir nada, a primeira imagem deve-se chamar 001.jpg.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque não usas um timestamp em vez de usares uma contagem? Assim terás a certeza que o ficheiro será sempre único.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dessa maneira ias ficar com nomes de ficheiros muito esquesitos. Depende do que ele quer fazer com os ficheiros.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu queria mesmo manter uma ordem do genero 1, 2, 3 etc... Pra ser mais fácil para a pessoa que vai ficar com o site de corrigir algum problema se o existir.

A solução que tenho agora renomeia para 1.jpg, 2.jpg, etc. Eu queria era engendrar uma maneira para ficar 001.jpg, 002.jpg, 010.jpg, 100.jpg etc...

Embora usar um timpestamp me pareça uma boa ideia. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para isso fazes uma função do estilo

function zeros($num){

if($num<10)
   return '00'.$num;
elseif($num<100)
   return '0'.$num;
else
   return $num;

}

$x=0;
$dir = '../galerias/'.$idgaleria.'/full/';
while ( file_exists( $dir . zeros(++$x) . $extensao ) );

Simples e eficaz.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nomes esquesitos? Seriam só numeros, nada mais... e números que estariam sempre a incrmenetar. E para corrigir problemas essa pessoa bastava ver o nome do ficheiro e pronto. Mas faz como quiseres, só acho que te estas a dar a trabalho desnecessário.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nomes esquesitos? Seriam só numeros, nada mais... e números que estariam sempre a incrmenetar. E para corrigir problemas essa pessoa bastava ver o nome do ficheiro e pronto. Mas faz como quiseres, só acho que te estas a dar a trabalho desnecessário.

Depende, se quiseres fazer estilo paginação em que os números seguidinhos dêm jeito, isso pode não dar jeito. Epá depende do que se fizer. Eu também gosto da ideia do timestamp, mas depende para o que seria. Eu sou estou a solucionar da maneira que, à partida, lhe dá mais jeito e que ele pediu.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque não usas um timestamp em vez de usares uma contagem? Assim terás a certeza que o ficheiro será sempre único.

Fails, basta eu e tu estarmos a uppar ao mesmo tempo. Mas também se resolvia isso juntando o md5 hash por exemplo.

Para isso fazes uma função do estilo

function zeros($num){

if($num<10)
   return '00'.$num;
elseif($num<100)
   return '0'.$num;
else
   return $num;

}

$x=0;
$dir = '../galerias/'.$idgaleria.'/full/';
while ( file_exists( $dir . zeros(++$x) . $extensao ) );

Simples e eficaz.

A tua função está limitada a 3 algarismos.
function zeros($z, $algarismos = 4){
    if( ($y = (strlen((str)$z))) > $algarismos) $z = str_repeat("0", $y);
    return $z;
}
#uso:
echo zeros(1); //output esperado: 0001
echo zeros(1, 6); //000001

Não testado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Primeiro, não foi explicado o ambiente em que isto seria usado e não ser que fosse um serviço como o imageshack ou hdd, duvido muito que alguém estivesse a enviar um ficheiro no exacto segundo que outra pessoa também o estivesse a fazer.

E se por acaso o ficheiro já existisse poderia-se sempre incrementar um valor ao timestamp e já estava resolvido. Claro que tinha de se estar sempre a verificar se o ficheiro já existia ou não, mas caso existisse-- onde as probabilidades de isso acontecer são muito remotas (dependendo do ambiente)-- bastava incrementar um valor e voltar a verificar e estava o assunto resolvido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não ser que fosse um serviço como o imageshack ou hdd, duvido muito que alguém estivesse a enviar um ficheiro no exacto segundo que outra pessoa também o estivesse a fazer.

Falhava em muitiupload, por exemplo.

E se por acaso o ficheiro já existisse poderia-se sempre incrementar um valor ao timestamp e já estava resolvido. Claro que tinha de se estar sempre a verificar se o ficheiro já existia ou não, mas caso existisse-- onde as probabilidades de isso acontecer são muito remotas (dependendo do ambiente)-- bastava incrementar um valor e voltar a verificar e estava o assunto resolvido.

Sim, funcionava, mas acho isso uma forma de desenrascar quando podes fazer sem desenrasque...
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não acho que seja uma forma de desenrasque nada, é apenas uma forma de fazer as coisas. No caso do multiupload até se poderia fazer de diferente forma, o segundo seria o mesmo logo o timestamp seria o mesmo, se se estivesse a enviar mais que um ficheiro poderia se concatenar ao fim do ficheiro uma letra de 'a' a 'z'. E não acho que isto sejam formas de desenrasque, mas sim formas de fazer as coisas muito mais simples que estar a processar o directório e ver os ficheiros que existem e calcular o número correcto e etc, mas pronto... São soluções diferentes, eu apenas sugeri uma, que no meu ponto de vista, é mais simples e dá menos trabalho.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora