Você pode querer testar o md5 da imagem enquanto ela é enviada e armazená-la em uma estrutura de diretórios como esta abaixo. Assumindo 3 imagens que hash para:
- 2b00042f7481c7b056c4b410d28f33cf
- 84bdbf7c4d48e16642af4c317df428c2
- 7b2a7edc6e86224d6ba0f97b717c80ed
E uma estrutura de pastas com esta aparência:
/images/orig/2/2b/2b0/2b00042f7481c7b056c4b410d28f33cf.jpg /images/orig/8/84/84b/84bdbf7c4d48e16642af4c317df428c2.jpg /images/orig/7/7b/7b2/7b2a7edc6e86224d6ba0f97b717c80ed.jpg /images/large/2/2b/2b0/2b00042f7481c7b056c4b410d28f33cf.jpg /images/large/8/84/84b/84bdbf7c4d48e16642af4c317df428c2.jpg /images/large/7/7b/7b2/7b2a7edc6e86224d6ba0f97b717c80ed.jpg /images/small/2/2b/2b0/2b00042f7481c7b056c4b410d28f33cf.jpg /images/small/8/84/84b/84bdbf7c4d48e16642af4c317df428c2.jpg /images/small/7/7b/7b2/7b2a7edc6e86224d6ba0f97b717c80ed.jpg
Você pode fazer tantos níveis seguindo o padrão acima quanto desejar manter os tamanhos de diretório gerenciáveis. Além disso, se preferir, você pode usar algum ID de usuário para identificar as imagens e ainda usar uma estrutura semelhante, por exemplo. assumindo o id do usuário de 14: (/images/orig/0/00/0014/0014.jpg)
Você pode armazenar o usuário - > dados hash de imagem em seu banco de dados, mantendo suas imagens no sistema de arquivos. Independentemente do fato de que pode ser possível armazenar imagens dentro de um banco de dados, há razões pelas quais você pode não querer fazê-lo. Mantê-los no sistema de arquivos torna-os muito mais fáceis de mover, digamos para um CDN ou para a nuvem à medida que você cresce. Ele também permite que você coloque diretórios em discos diferentes para aumentar o desempenho de leitura, se é isso que você gosta.
O fato de você transformar a imagem original em md5 significa que, se 30 pessoas enviarem a mesma imagem, você manterá apenas uma cópia (em todos os tamanhos) dessa imagem em seu sistema de arquivos, em vez de 30 cópias.