Programação, PHP, Javascript, HTML, CSS, Python
sexta, 3 de setembro

Mover arquivos sem sobrescrever arquivos existentes acrescentando número incremental em PHP

A função move move um arquivo para uma nova localização sem sobrescrever um arquivo existente acrescentando um número incremental entre o nome e extensão do arquivo movido.

Se você quer fazer upload de arquivos sem alterar o nome original do arquivo enviado move é uma ótima opção.

Exemplos:

Arquivo

// primeira vez
move('images/bg.jpg', 'images/background/bg.jpg');
// images/background/bg.jpg

// segunda vez, supondo que bg.jpg foi recolocado no diretório images
move('images/bg.jpg', 'images/background/bg.jpg');
// images/background/bg-1.jpg

// terceira vez
move('images/bg.jpg', 'images/background/bg.jpg');
// images/background/bg-2.jpg

Upload

move($_FILES['arquivo']['tmp_name'], 'uploads/'.$_FILES['arquivo']['name']);

Move substitui move_uploaded_file? Sim. Arquivos enviados são armazenados em um diretório temporário definido pelo servidor, como por exemplo no Linux o /tmp por padrão. Mover arquivos de /tmp ou de um outro diretório qualquer é a mesma coisa, sempre que o usuário tenha as permissões necessárias no diretório.

Código fonte

<php

/**
 * Move
 *
 * @author Alejandro Fernandez Moraga <moraga86@gmail.com>
 * @param string $filename Arquivo
 * @param string $destination Destino do arquivo
 * @return string|false
 */

function move($filename, $destination) {
	# separa diretório e nome do arquivo da extensão usando expressão regular
	$name = preg_split('#(?:\.([^\.]+))?$#', $destination, -1, PREG_SPLIT_DELIM_CAPTURE);
	# array com informações do arquivo
	$meta = array($name[0], '', $name[1] ? '.' : '', $name[1]);

	# laço percorre o diretório destino procurando por arquivos com mesmo nome
	# acrescenta um valor incremental entre o nome e extensão do arquivo
	# quando um arquivo de mesmo nome é encontrado
	for ($i=0; file_exists($file = implode($meta)); $meta[1]=--$i);

	# renomeia o arquivo
	# retorna o nome do arquivo movido ou falso
	return rename($filename, $file) ? $file : false;
}

?>

Leave a Comment

Sobre o autor

Alejandro Moraga é um cientista da computação. Atualmente é o Webmaster da FAPESP. Já foi o desenvolvedor de sistemas ERP e CRM na Internetmídia. Moraga também desenvolve frameworks, ferramentas, sistemas e sites em nome da empresa METS no qual é sócio junto com sua esposa, e é um pesquisador da Inteligência Artificial.

Mais artigos

Converter array para objetos específicos em PHP
Converter array para objetos específicos em PHP

A conversão de tipos por Cast do PHP é limitada quando falamos de objetos. Para gerar objetos específicos vamos [Leia mais]

Valor monetário (float) a todo custo
Valor monetário (float) a todo custo

Valor monetário a todo custo é porque a função abaixo vai extrair de uma string e retornar os números com ponto [Leia mais]

Validar números de agências e contas correntes do Banco do Brasil
Validar números de agências e contas correntes do Banco do Brasil

Outro dia precisei validar números de agências e contas do Banco do Brasil. Para quem precisar segue as [Leia mais]

Guia de Expressões Regulares Compatíveis com Perl – PCRE
Guia de Expressões Regulares Compatíveis com Perl – PCRE

Guia PHP PCRE com funções, meta caracteres, modificadores do padrão, classes de caracteres base, quantificadores e [Leia mais]

Sequências aleatórias com nível de complexidade
Sequências aleatórias com nível de complexidade

Sequências de caracteres aleatórios são úteis para muitos propósitos. Existem funções pré-prontas, como a rand [Leia mais]