PHP - Tabla con las rutas de las imágenes, o leer directamente el directorio.

 
Vista:

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Sebastian Báez (4 intervenciones) el 25/04/2019 15:40:31
Buenos días, resulta que tengo la típica tabla de usuarios la cual tiene su campo de foto de perfil.
Lo que estoy haciendo es que cuando un usuario sube un archivo, en el servidor se crea una carpeta con el nombre "id_usuario + '-' + documento_usuario", entonces quedaría algo como "115-1098812455".
Posteriormente cuando el usuario necesita ver todos sus archivos, leo directamente la carpeta con PHP y le muestro los archivos obtenidos.
Mis preguntas son, ¿Es buena práctica hacer esto? ¿Afecta mucho el rendimiento? Es mejor tener una tabla llamada "archivos" y guardar la ruta de la imagen y el usuario al que pertenece?
Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Mauro (1036 intervenciones) el 26/04/2019 15:44:35
No lo veo mal en principio... lo único que me pregunto es cuántos usuarios tienes... Si son muchos (y hay mucha concurrencia) eso podría afectar el rendimiento (y saturar los recursos de tu servidor)... para estos casos (archivos estáticos especialmente) te puede servir mejor usar algún servicio tipo S3 y, por el lado del rendimiento usar algún CDN.

No veo que tener una tabla archivos mejore mucho pero habría que estudiar el caso en mayor detalle para decirlo.

A priori, si la estructura de carpetas es bien regular me parece lógico usar el sistema de archivos. Tal vez algo que te podría ayudar (pensando en que si el rendimiento se vuelve pobre puedas migrar fácilmente) es usar FlySystem...

Por útlimo, un truco que vi implementado en algunos lugares (donde se manejan muchísimos archivos) es dividir la estructura de carpetas según prefijos, de modo de tener un árbol más amplio.

En tu caso, tendrías algo como:

1/1/5-1098812455

De ese modo evitas que un directorio específico se vuelva un cuello de botella con tantas lecturas simultáneas... Igual, no estoy realmente seguro de qué tanto mejora esto (Supongo que depende del hardware...)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Sebastian Báez (4 intervenciones) el 26/04/2019 16:23:37
Vale. muchas gracias por tu respuesta la tendré en cuenta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Kathyu (905 intervenciones) el 26/04/2019 18:00:43
Pero saturaría la DB que en la tabla de usuario se guarde el nombre del archivo y que en la vista solo mande llamar la imagen con el src de donde esta mas el nombre del archivo de la DB?

1
<img src="ruta/nombre_archivo_desde_la_base.jpg" />
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Sebastian Báez (4 intervenciones) el 26/04/2019 18:30:54
Hola, gracias por responder. Propones guardar la ruta tal como dice en el titulo, entonces dices que saturaría la DB leer los archivos directamente del directorio? No entiendo por qué dices eso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Kathyu (905 intervenciones) el 26/04/2019 18:54:36
Es una pregunta a Mauro.

Osea por lo general se hace así, se guarda el nombre del file en la DB y se manda a llamar desde la vista.

Entonces yo entendí que Mauro dice que hacerlo así saturaría la DB, y eso es lo que quiero que me aclare.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Mauro (1036 intervenciones) el 26/04/2019 22:28:59
No veo por qué saturaría la db guardar la ruta. Lo único que podría afectar ahí es que haya muchos usuarios (o procesos) "pegándole" a la base pero no creo que eso suceda especialmente por almacenar la ruta... (Y en tal caso, no sería muy difícil de resolver con un buen caché).

En definitiva, de alguna forma hay que vincular el registro de la base (el usuario) con su imagen.

Si todas las imágenes siguen una lógica (es decir, la ruta se puede computar a partir de los datos del usuario), es redundante guardar la ruta en la base, en caso contrario... no veo otra manera de lograrlo :p
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Kathyu (905 intervenciones) el 26/04/2019 23:57:28
Pues definitivamente yo creo que guardar el nombre de la imagen en la DB y después mandarlo llamar en la vista es lo mejor y no satura la DB.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Mauro (1036 intervenciones) el 27/04/2019 16:56:23
Sí, esa forma está bien. El tema de la saturación no pasa tanto por la base de datos si no por la lectura del archivo de imagen.

Cada vez que un usuario recibe un html tipo
1
<img src="imagen.jpg"/>
eso produce un request al servidor donde está alojada la imagen.

Si los archivos están mejor distribuidos es más difícil que se produzcan cuellos de botella.

Una forma de lograrlo es evitar tener todos los archivos en un solo directorio (Aunque es mucho mejor usar otras técnicas como tener los archivos estáticos en un servidor diferente).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Javier (orzo) Rodríguez
Val: 85
Ha disminuido su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Javier (orzo) Rodríguez (25 intervenciones) el 27/04/2019 22:00:07
Hola, Báez.
Yo he resuelto el problema ubicando todas las imágenes en una carpeta concreta y añadiendo una referencia al fichero en la tabla de usuarios. Explico la razón.
Mi aplicación tiene una pequeña gestión documental relacionada con cada usario. Éste añade una imagen, un fichero pdf, un plano dwg o lo que sea y le asigna una referencia y una pequeña explicación del contenido (ambos campos de texto). El programa ignora el nombre del fichero original y le asigna un nombre arbitrario basado en la hora, la fecha y un campo único del usuario que se guarda en el mismo registro que todo lo anterior.
El mismo programa permite buscar cualquier contenido de la gestión documental -es decir, de todos los ficheros anonimizados- simplemente escribiendo en una caja de texto el texto a buscar y muestra el resultado como una colección de miniaturas con la referencia y la pequeña explicación debajo, relacionada.
Esto permite al usuario clicar sobre el tipo de fichero que sea y visualizarlo.
No sé de qué volumen de datos estás hablando, pero para un tamaño de carpeta de 4 gigas con 25.000 ficheros de todo tipo todavía no me he encontrado con ningún problema de rendimiento.
Lo más importante de esta explicación es que, creo yo, hacerlo de un modo u otro depende del uso a posteriori que quieras hacer con tus imágenes.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Tabla con las rutas de las imágenes, o leer directamente el directorio.

Publicado por Sebastian Báez (4 intervenciones) el 29/04/2019 14:23:09
Muchas gracias por responder, tendré en cuenta la forma en la que tu lo has hecho.
En este momento creo que optaré por leer los archivos directamente desde el directorio, si más adelante veo problemas de rendimiento usaré una tabla con el nombre de la imagen.
Porque me puse a pensar que pasaría si el usuario tiene 300 imágenes, supongo que si afectaría leer 300 imágenes de golpe y mostrarlas, en cambio con una tabla podría paginar los registros (Estoy usando Laravel Lumen).
Por ahora leeré los archivos directamente porque el usuario no necesitará subir muchas imágenes, a lo mucho tendrá 5 o 10.
Gracias a todos por exponer sus puntos de vista.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar