2012-01-19 20 views
34

No tengo idea de cómo los sitios web grandes guardan las imágenes en sus servidores. ¿Alguien podría decirme cómo guardan las imágenes que cargan los usuarios en su base de datos?¿Cuál es la mejor manera de cargar y almacenar imágenes en el sitio?

Estaba pensando, tal vez solo guardarían el archivo (la imagen) en algún camino y simplemente guarden esa ruta en el databse ¿verdad?

Pero quiero hacerlo de esta manera. ¿Es esto correcto? Por ejemplo, un sitio web llamado www.photos.com. Cuando un usuario carga una imagen, crearía una carpeta con el nombre de usuario y guardaría esas imágenes en esa carpeta.

Creo que podemos crear un directorio usando php file concepts. Entonces, cuando un nuevo usuario sube su imagen o archivo, quiero crear un directorio con su nombre.

Ejemplo: si el nombre de usuario es John, crearía un directorio como este en photos.com www.photos.com/john/ y luego guardará todas sus imágenes en este directorio cuando cargue una imagen. ¿Es esta la manera correcta de hacer esto?

No tengo a nadie aquí que tenga buenos conocimientos de guardar los archivos en los servidores, así que por favor, hágamelo saber cómo hacerlo. Quiero hacerlo de la manera correcta y segura.

+2

@AdrianCornish ¿Podría decirme qué quiere decir con qué ha intentado? No te pido que me escribas un código, solo quiero el algoritmo o el proceso que la mayoría de las personas sigan para poder seguir adelante si sé qué hacer – niko

+0

¿Qué has intentado de nuevo? Puede almacenar una ruta al archivo, puede almacenar los datos binarios en la base de datos. ¿Cuál es tu pregunta real? –

+0

Tu pregunta está mal formulada, estás preguntando cómo subir fotos. No es cómo almacenar las imágenes cargadas en su sitio.Además, ¿qué haces para proteger a los usuarios contra la carga de códigos maliciosos, imágenes con cargas ocultas, deteniendo a las personas que acaparan todas tus imágenes desde una URL indexable? –

Respuesta

125

Todos los grandes sitios web no guardan las imágenes en la base de datos las guardan en el disco. Guardan una referencia a la posición de la imagen en una tabla. Y luego vincular desde allí.

¿Por qué? Actuación.

Extraer contenido pesado de una base de datos es un gran cuello de botella de rendimiento. Y las bases de datos no se escalan horizontalmente tan bien, por lo que significaría incluso un problema mayor. Todos los sitios grandes usan granjas de contenido estático para tratar con contenido estático como imágenes. Son servidores a los que no les importará tu identidad.

¿Cómo pueden mantener las imágenes realmente privadas? Ellos no.

El enlace de la imagen es, en sí mismo, la dirección y la contraseña. Tomemos Facebook, por ejemplo. Si guardo una foto privada en mi cuenta, no debería poder abrirla. Pero, siempre que tengas la dirección correcta, puedes.

This picture is private. Aviso el nombre del archivo
10400121_87110566301_7482172_n.jpg
(facebook cambia la url de vez en cuando por lo que el enlace puede ser quebrantada)

Es no secuencial. La única forma de hacerse una idea es conocer su dirección.
Según una foto de usuario anterior, no puede adivinar la siguiente.
Tiene una gran entropía por lo que incluso si comienzas a tomar conjeturas salvajes al azar tendrás una gran cantidad de fallas y, si llegas a una imagen, no podrás, a partir de ahí, darse cuenta de la identidad de los propietarios que, en sí mismo, es protección en el anonimato.

Editar (¿por qué no se debe almacenar imágenes en un "nombre de usuario" carpeta:.
Después de su edición se hizo evidente que se tiene intención de poner los archivos en el disco y no en la base de datos Esta edición cubre el nuevo escenario .

Aunque su lógica (crear una carpeta por usuario) se ve más organizada, crea problemas cuando comienza a tener muchos usuarios y muchas imágenes. Imagine que sus servidores tienen 1T de espacio en disco. Y también imaginemos que 1T es más o menos preciso con la carga que el servidor puede manejar.

Ahora tiene 11 usuarios, suponga que comienzan a cargar al mismo tiempo y cada uno cargará más de 100GB de archivos. Cuando alcanzan los 91 GB cada uno, el servidor está lleno y debe comenzar a almacenar imágenes en un servidor diferente. Si se sigue esa estructura de usuario/carpeta, deberá seleccionar uno de los usuarios y migrar todos sus datos a un servidor diferente. Además, establece un límite estricto para un usuario que no puede cargar más de 1T en archivos.

¿Debo almacenar todos los archivos en la misma carpeta, entonces?
No, los sitios grandes generalmente almacenan archivos en carpetas secuenciales (/ 000001 /,/000002 /, etc.) que tienen un número x definido de archivos por carpeta. Esto es principalmente para problemas de rendimiento del sistema de archivos.

Más sobre how many files in a directory is too many?

+14

explicación BRILLANTE. Exactamente lo que estaba buscando, gracias. – CyberJunkie

+0

Gracias Frankie, eso es muy claro. Pero hay otra manera que debería ser más interesante: almacenar las imágenes en un proveedor de almacenamiento de imágenes específico. – Fred

+1

@Fred absolutamente cierto. Esta respuesta está específicamente diseñada para establecer la mentalidad correcta en alguien que no tiene idea de cómo funcionan las cosas. Tan pronto como empiece a hospedar un par de millones de imágenes en su sitio, probablemente querrá dividir el problema y/o externalizar el alojamiento de esos recursos. La mentalidad, sin embargo, se mantiene igual. En la base de datos solo hace referencia a la ubicación de la imagen. Gracias por el comentario. – Frankie

4

Por lo general es una mala idea para almacenar imágenes en su base de datos (si su sitio es popular). La base de datos es, tradicionalmente, uno de los principales cuellos de botella en la mayoría de las aplicaciones que existen. No es necesario cargarlo más de lo necesario. Si las imágenes están en el sistema de archivos, muchos servidores http (nginx, por ejemplo) les serán más eficientes.

La mayor red social en Rusia, Vkontakte hace exactamente esto: almacenar imágenes en el sistema de archivos.

Otra gran red social implementó un sofisticado almacenamiento blob escalable. Pero no está disponible para el público, AFAIK.

Resumen de esta respuesta: no almacenar blobs en la base de datos.

1

La gestión de la imagen se puede lograr mejor mediante la carga física de imágenes en el servidor y luego la grabación de la ubicación del archivo y los detalles de la imagen en una base de datos. Posteriormente, se podría configurar un Formulario de búsqueda para permitir al usuario hacer una búsqueda de texto, búsqueda de número de parte u otras consultas. Se podría escribir un script PHP para producir una etiqueta de imagen HTML válida basada en los datos que se encuentran en la tabla.

cargar imágenes en un campo MySQL ™ BLOB es una mala idea, tales datos de imagen son generalmente problemáticos si las imágenes son mucho más grandes que las miniaturas. Si las imágenes son grandes, puede terminar teniendo que copiar/pegar una instrucción SQL INSERT a la vez (en phpMyAdmin). Si las imágenes son grandes y el editor de texto divide la instrucción SQL INSERT en dos líneas, nunca podrá restaurar la imagen.

2

es esta la forma correcta de hacer

Sí.
Lo único que sugeriría es usar no el nombre sino el ID.
www.photos.com/albums/1234/ estaría bien para empezar.

Cuestiones relacionadas