Qual é a melhor prática para nomear as imagens enviadas?

14

Suponha que eu tenha um formulário em meu aplicativo da web no qual os usuários possam fazer upload de uma foto de perfil.

Eu tenho alguns requisitos sobre o tamanho do arquivo, dimensões, etc, mas quando o usuário faz o upload da imagem, como devo nomeá-los no meu sistema? Suponho que precisaria ser consistente e também único.

Talvez um GUID?

a5c627bedc3c44b7ae7c06a44fb3fcf8.jpg

Um timestamp?

129899740140465735.jpg

Um hash? Ex: md5

b1a9acaf295cf14ffbc5b6538294562c.jpg

Existe uma maneira padrão ou recomendada de fazer isso?

    
por Rowan Freeman 04.04.2013 / 08:03
fonte

5 respostas

27

Você deve tentar atingir dois objetivos: singularidade e utilidade.

Usar um GUID garante exclusividade, mas um dia os arquivos podem ser desanexados da fonte original e, em seguida, você terá problemas.

Minha solução típica é incorporar informações cruciais no nome do arquivo, como a ID do usuário (se pertencer a um usuário) ou a data e hora carregadas (se isso for significativo) ou o nome do arquivo usado ao fazer upload.

Isso pode realmente salvar sua pele um dia, quando as informações incorporadas no nome do arquivo permitem, por exemplo, recuperar-se de um bug ou a exclusão acidental de registros. Se tudo o que você tem são GUIDs e você perde o catálogo, você terá um trabalho de limpeza.

Por exemplo, se um arquivo "My Holiday: Florida 23.jpg" for carregado, por userID 98765, em 2013/04/04 às 12:51:23 eu nomearia algo assim, adicionando uma string aleatória ad8a7dsf9 :

20130404125123-ad8a7dsf9-98765-my-holiday-florida-23.jpg

  • A exclusividade é assegurada pela data e hora e pela sequência aleatória (desde que seja apropriadamente aleatória de / dev / urandom ou CryptGenRandom.
  • Se o arquivo já estiver desanexado, você poderá identificar o usuário, a data e a hora e o título.
  • Tudo é dobrado em minúsculas e qualquer coisa não alfanumérica é removida e substituída por traços, o que torna o nome do arquivo fácil de manusear usando ferramentas simples (por exemplo, sem espaços que possam confundir scripts mal escritos, sem vírgulas ou outros caracteres proibidos em alguns sistemas de arquivos e assim por diante).
por 04.04.2013 / 09:34
fonte
4

Você não quer enfatizar aplicativos (como o Explorer) e fazê-lo falhar ao abrir o diretório. Embora seja improvável que você vá enfatizar o sistema de arquivos real, você precisa levar isso em conta se for armazenar milhares de arquivos.

Se você espera armazenar milhares de arquivos, minha sugestão é particionar em pastas. Por exemplo, upload\silo001 , upload\silo002 , etc. Você pode balancear seus arquivos ou esperar até que uma pasta atinja um determinado número de arquivos e depois criar outra.

Com relação à nomenclatura, sempre nomeio um arquivo com um GUID porque ele é globalmente exclusivo. Eu pego a extensão do upload e defino a extensão do arquivo para corresponder, mas o nome real é definido a partir de um novo Guid.

Se você estiver fazendo isso em conjunto com um RDBMS e tiver várias categorias, por exemplo, produtos, categorias etc., poderá ter upload\products , upload\categories e assim por diante, e poderá usar a ID da linha como o nome do arquivo .

Em termos de melhores práticas, também procurei no passado e não encontrei nada. Eu vim com o acima exposto enquanto discutia com alguns dos meus desenvolvedores.

    
por 04.04.2013 / 08:12
fonte
2

Em uma das soluções em que trabalhei anos atrás, fizemos isso: subpastas para parte do id do usuário, portanto, se o seu ID de usuário for 232950192

teríamos imagens de subpastas / 23/29/50/192/232950192

na pasta final tem pastas para álbuns e perfil imgs etc

Mas também salvamos tudo na base de dados e o mantemos no sistema de arquivos para acesso rápido ao servidor Web (que também tem armazenamento em cache)

De qualquer forma, a imagem final teria o nome da imagem original. Nós não precisamos manter versões. Mas para o que pode manter mais subpastas sob os nomes finais dos álbuns ou na base de dados com um ID de versão. precisa pensar que uma vez que vai para a produção seria difícil mudar as coisas sem consumir tempo e correções propensas a erros na estrutura atual

É muito fácil criar uma subpasta em java e criar um arquivo nela:

    File folder = new File(pathwithslashes);// like "images/23/29/50/192/232950192"
    folder.mkdirs();
    File imgFile = new File(folder, name);
    //Now get output stream etc

Para obter o carimbo de data nas subpastas:         SimpleDateFormat sdf = new SimpleDateFormat ("/ aaaa / MM / dd /");         pathwithslashes = pathwithslashes + sdf.format (now); // agora é um util.Date         Pasta de arquivos = novo arquivo (pathwithslashes);

Dot net link

    
por 23.05.2017 / 13:33
fonte
1

Eu recomendaria usar apenas md5 ou qualquer coisa conceitualmente equivalente. Ao renomear arquivos por resumo do conteúdo, você não está apenas concedendo exclusividade (sempre armazene imagens o máximo de tempo possível, e com renomeação baseada em conteúdo, bem, com a adequada, você pode armazenar imagens praticamente para sempre).

Além disso, não é grande coisa, mas, no entanto, não é um caso hipotético quando usuários diferentes enviam exatamente a mesma imagem. Apenas fora da caixa você terá uma pequena otimização de armazenamento de dados.

Quanto a qualquer outra coisa proposta: quanto a mim, sou um strong oponente de manter qualquer tipo de informação auxiliar em um nome de arquivo. Quando eu era muito mais jovem (e um pouco mais magro :), eu fui um desenvolvedor de Perl e tinha um hábito duvidoso de armazenar o máximo de informações auxiliares no nome do arquivo que o senso comum me permitia, já que os padrões de string Perl são incríveis. E cheguei à conclusão de que, falando de desenvolvimento web, é sempre melhor escolha para manter os dados associados ao arquivo separadamente do nome do arquivo.

Tenha em mente que hoje em dia, quando as interfaces móveis estão dominando, o nome real do arquivo é menos importante do que era 5, 10 anos atrás. Mas mesmo que isso seja crucial no contexto do seu aplicativo, você sempre pode envolver alguma mágica da velha escola com o envolvimento do Content-Disposition: attachment; filename="pretty_file_name.jpg" cabeçalho HTTP, construindo qualquer nome de arquivo relevante que você desejar. Além disso, os navegadores modernos estão abrindo caminho para o novo atributo HTML5, download . Não acredito que ver nomes de imagens "legíveis por humanos" seja algo que você deve pensar na maioria dos casos.

UPD: Uma modificação pode ser feita para não ter muitos arquivos em um diretório - apenas pegue as três primeiras letras e crie dir.

    
por 04.04.2013 / 10:16
fonte
-1

As chances de colisões com algo como sha4 são infinitesimais. Se você combinar o hash com o userid ou até mesmo uma data simples, menos ainda.

    
por 25.08.2017 / 23:27
fonte