2012-01-25 20 views
9

Mi pregunta no es sobre el almacenamiento de imágenes en el disco o en la base de datos.¿Cuál es la mejor práctica cuando se trata de almacenar imágenes para una galería?

  • Las imágenes se almacenan en el disco
  • Ruta de la imagen y otros datos de imagen se guardan en la base de datos.
  • Las imágenes se les da un nombre de archivo único
  • Las imágenes se almacenan en 3 tamaños
  • Con el tiempo puede haber muchas imágenes utilizadas por muchos usuarios

Mis preguntas son:
- deben ser imágenes almacenado en una carpeta, o en muchas carpetas?
- ¿Está bien usar md5 para crear identificaciones únicas? P.ej. md5 (id + nombre de archivo + número_aleatorio)
- ¿Las imágenes deben almacenarse en caché en el servidor o en el navegador/computadora de los clientes?

¿Algo más que debería pensar?

La solución es usar php, apache y mysql. Usamos Uploadify para cargar imágenes.

Parte del código que utilizo hoy

/** 
    * Calculate dir tree for object 
    * Folders starts from 00 to FF (HEX) and can have just as 
    * many subfolders (I think :) 
    * @param $id - User ID 
    * @param $type - Image category 
    * @return string 
    */ 
    function calculateDirTree($id, $type) 
    { 
     $hashUserID = substr(hash('md5', $id), -4); 
     $parentFolder = substr($hashUserID,0,2); 
     $subfolder = substr($hashUserID,2);  
     $basePath  = $type."/".$parentFolder.'/'.$subfolder.'/'; 

     return $basePath; 
    } 
+0

¿Cuántas imágenes cree que tendrá? Cientos? ¿Miles? Cientos de miles ? –

+0

Para los próximos años estimo alrededor de 100k - 200k imágenes. – Steven

+0

¿Utilizará el mismo nombre de archivo que el usuario ha cargado, y luego si almacena en la misma carpeta, es posible que pueda reemplazar una imagen, si tiene el mismo nombre de archivo que una imagen cargada previamente. –

Respuesta

3

¿Deben almacenarse las imágenes en una carpeta o en muchas carpetas?

Estás hablando de "100k - 200k images" tantas carpetas es imprescindible. Intenta tener max. ~ 1000 imágenes en la carpeta.

¿Está bien usar md5 para crear identificaciones únicas? P.ej. md5 (id + nombre de archivo + número_aleatorio)

Sí, puede hacerlo. Evitará problemas con nombres de archivo largos.

¿Las imágenes deben almacenarse en caché en el servidor o en el navegador/computadora de los clientes?

El debe estar en la memoria caché en el lado del cliente. El problema con tantas imágenes es que crea un alto tráfico. El almacenamiento en caché del cliente ayuda a reducir esto.

0

En cuanto al almacenamiento en caché, que sería mejor para almacenar en caché en ambos extremos, de esa manera nuevas imágenes se recuperan rápidamente, y los usuarios que visitan las imágenes existentes que se almacena en caché.

No conozco ningún límite del sistema de archivos para guardarlos en una o varias carpetas.

0

Creo que el uso de varias carpetas o la misma carpeta depende de su aplicación web. Por ejemplo, si hay múltiples perfiles con cada perfil con múltiples imágenes, puede usar múltiples carpetas con el uso de nombres de carpeta como nombres de perfil.

Mi último consejo es que si usted tiene un montón de imágenes sha256 algoritmo de cifrado es mejor para la prevención de colisiones

3

Dependiendo del número de imágenes que desea manejar, sugeriría encarecidamente el uso de varias carpetas. La manera más fácil debería ser usar la primera letra del nombre del archivo para crear una estructura de carpeta. Creo que, los números son algo como esto:

less than 1000 images --> one folder 
less than 20000 images --> one level of folders (a, b, c, ...) 
more     --> several levels (a containing aa, ab, b containing ba, bb, ...) 

YMMV

+0

Agregué la estructura de archivos que utilicé en mi prueba. Estoy considerando si debería seguir con esto. – Steven

0

ir definitivamente para el sistema de archivos: es más performante y se adapta mejor para el almacenamiento de archivos (eso es lo que se hace para). Sql puede disminuir la velocidad al guardar/recuperar imágenes grandes. Puede crear una carpeta para cada usuario (usando la ID como nombre de la carpeta) y cuando se guarda una imagen en el sistema de archivos puede guardar la referencia en una tabla UserImages (guardando el nombre de archivo contra el usuario en sql). Puedes asegurarte de que cada imagen tenga un nombre de archivo único al renombrarla cuando la guardas, puedes usar una combinación del nombre de archivo original con el DateTime actual (no es necesario usar MD5). Además, las imágenes siempre se deben almacenar en caché para poder guardar el ancho de banda de los clientes y el suyo.

+0

Si lee mi pregunta, no pregunto si el disco o la base de datos es lo mejor. Además, acabas de describir (en otras palabras) mi pregunta anterior. – Steven

+0

Hola Steven, si vuelves a leer mi respuesta, he intentado responder tus preguntas, si no está claro: 1) Sí, debes dividir las imágenes en varias carpetas (la mejor una por usuario). 2) No, no necesita md5 para el nombre de archivo, solo use el DateTime de la carga. 3) Sí, debe almacenar en caché las imágenes si la misma imagen en el servidor no cambia (es: la imagen está recortada y mantiene el mismo nombre de archivo). Si eso no es lo que estás buscando, reformula tu pregunta. –

Cuestiones relacionadas