La mejor manera de almacenar imágenes en un sistema de archivos [cerrado]

7

Desarrollando una aplicación en la que los usuarios tienen que subir imágenes. Realmente no tengo mucha experiencia con la carga de archivos en una aplicación, así que me pregunto cuál es la mejor manera de almacenar imágenes que los usuarios cargan en el sistema de archivos.

    
pregunta cobie 14.09.2012 - 17:21

3 respuestas

15

Una buena estrategia de inicio básica es así:

  • Haz una tabla llamada 'imágenes'. Asegúrese de que tenga una clave principal de autoincremento (llamaremos ID).
  • Cuando un usuario carga una imagen, inserte una fila en esa tabla, incluido el nombre original del archivo y la extensión del archivo. Es probable que también realice un seguimiento del usuario de carga, fecha / hora, etc.
  • Obtenga el último ID de inserción de esa consulta. Guarde la imagen en "your-image-path / (ID). (Ext)" en el sistema de archivos. Por ejemplo, "/images/350.png".
  • (Recomendado) Puede usar la ID como enlace directo a la imagen haciendo un simple script de envoltura que carga la imagen por ID (ocultando así el nombre real del archivo, o incluso manteniendo las imágenes fuera de los directorios web). Por ejemplo, 'image.php? Id = 500' o '/ image / 500'. En ese script, puede usar el nombre del archivo original de la tabla en el encabezado http para que cuando se descarguen se guarde en el cliente con el nombre original.

Áreas de mejora:

  • Soporte de miniaturas. En la carga, genere una miniatura y guárdela como ".thumbnail.jpg". Use una secuencia de comandos de envoltura para la recuperación de miniaturas basada en ID.
  • Hashing directorios. Si espera más de 1000 o más imágenes, querrá dividirlas en varios subdirectorios para que el sistema de archivos no se vuelva lento (el punto exacto en que esto sucede varía según el sistema operativo y otros factores). Así que si tiene una ID de imagen de 6500, puede almacenarla en "/images/6/6500.png"
  • Seguridad. Valide que una imagen cargada sea una imagen real antes de guardarla en el disco. Esto es especialmente importante si está permitiendo el acceso directo a las imágenes; no desea aceptar un archivo .php que se pueda cargar y luego ejecutar. También asegúrese de que la configuración de su servidor web esté configurada para evitar ese tipo de cosas impidiendo la ejecución de scripts desde los directorios de imágenes.
respondido por el GrandmasterB 14.09.2012 - 22:05
5

Las imágenes son solo archivos, por lo que puede almacenarlas como están, como lo haría con cualquier otro archivo.

Sin embargo, es posible que desee transformarlos un poco. Por ejemplo, la mayoría de las cámaras digitales en estos días producen archivos de resolución absurdamente alta, por ejemplo. 2000 píxeles de ancho. La mayoría de los usuarios no saben cómo convertirlos en algo más manejable, e incluso si lo tuvieran, no tienen el tiempo (o no pueden ser molestados). encogerlos.

Además, ¿qué vas a hacer con las imágenes? ¿Mostrarlos en una página web? Solo hay ciertos formatos que funcionan en una página web, por ejemplo, Si alguien subió una imagen TIFF, es posible que desee convertirla a JPEG o PNG.

Por último, es posible que desee aumentar la compresión. Si alguien te envía una imagen con una resolución razonable, pero todas las opciones de "calidad" se han convertido en 11, seguirá siendo un archivo grande. Es posible que desee comprimirlo más para convertirlo en un archivo más pequeño.

Una consideración final: si vas a hacer cualquier manipulación de imágenes, es posible que desees poner todas las imágenes en el mismo formato, por ejemplo. JPEG a una cierta resolución y nivel de compresión, por lo que la manipulación de la imagen solo tiene 1 formato para tratar.

    
respondido por el Martin C. Martin 14.09.2012 - 17:28
3

La estrategia de almacenamiento debe, en la mayoría de los casos, seguir el diseño conceptual del sitio que requiere el almacenamiento de imágenes y el número esperado de usuarios. Necesitaremos más información, creo; ¿Está creando un sitio como Photobucket o Flickr, diseñado principalmente para ser un sitio de alojamiento de imágenes? ¿O son las imágenes una preocupación secundaria, como ser archivos adjuntos a los mensajes? ¿Cuántas imágenes prevén tener que almacenar? ¿Cuántos usuarios tendrá este sistema?

Dos estrategias populares que conozco y que he usado involucran una base de datos SQL, para proporcionar una mejor concurrencia que un sistema de archivos planos. Tienes una tabla, que representa las imágenes en la base de datos. Esa tabla luego tiene una columna "BLOB" (objeto binario grande) que almacena los datos de bytes reales de la imagen, o una cadena que contiene la ruta a la imagen en un sistema de archivos plano en otro lugar. De cualquier manera, la búsqueda de datos sobre imágenes es altamente paralelizable. El almacenamiento de imágenes en el disco es más sencillo y reduce el tamaño de la base de datos, pero reduce el rendimiento en situaciones de gran cantidad de usuarios. El almacenamiento de imágenes como datos de base de datos es lo contrario.

    
respondido por el KeithS 14.09.2012 - 17:32

Lea otras preguntas en las etiquetas