2010-04-26 13 views
26

Estoy creando una aplicación web (en Django), que debe permitir a los usuarios cargar archivos (específicamente imágenes, que luego se mostrarán para otros usuarios). Estoy tratando de entender la mejor manera de almacenar estos archivos cargados.La mejor manera de almacenar archivos cargados por el usuario en una aplicación web

De las preguntas relacionadas, vi que algunas personas sugirieron darle al archivo un ID único generado por el servidor y luego crear una tabla de base de datos que asigna los identificadores a los nombres de archivo originales.

¿Es este el mejor método para almacenar archivos cargados por el usuario, desde una seguridad, eficiencia o desde cualquier otro punto de vista? ¿Qué tipo de información debo guardar sobre cada archivo?

¿Existen otras prácticas recomendadas relacionadas con la aceptación de archivos cargados por el usuario? (Además de asegurarse de que realmente sean imágenes y verificar su tamaño, obviamente)?

Editar: Un poco más de información acerca de lo que necesito. Hablo específicamente de los archivos de imagen que los usuarios deben cargar e incrustar en el contenido que crean. Imagínenlo como una respuesta de StackOverflow (o una publicación de blog): alguien carga una imagen, que debe almacenarse y mostrarse cada vez que alguien más vea la respuesta.

Gracias,
Edan
Nota: Hay varias preguntas relacionadas, pero no he encontrado uno que pide una comparación de las formas de almacenar los archivos subidos por los usuarios.

+0

hola edan, he llegado al mismo problema. Voy a crear una aplicación donde los usuarios pueden subir imágenes/pdfs. Luego pueden ver/descargar archivos. Estoy pensando en el almacenamiento del sistema de archivos. ¿Solo quieres saber de qué manera prefieres tu experiencia? –

+1

La dirección que planeo seguir es: 1. Una base de datos para contener información "meta" (nombre original del archivo, etc.). 2. Archivos físicos en el sistema de archivos, con un nombre que es el índice en el db de la metainformación. Puede haber más de un archivo físico para cada entrada de db, por cierto, que corresponde a diferentes resoluciones, por ejemplo. Por ejemplo, tendré archivos: 254_high_res.jpg, 254_los_res.jpg, donde 254 es el índice en la base de datos de la metainformación para el archivo 254. –

+0

gracias edan. Voy a almacenar imágenes con los nombres generados por radon guid como nombre de archivo. y para una resolución diferente, voy a usar el controlador. http://dotnetslackers.com/articles/aspnet/Generating-Image-Thumbnails-in-ASP-NET.aspx –

Respuesta

2

Esa es una gran pregunta.

En relación con su caso de uso de imagen, este es el dominio de un servidor de imágenes que, por lo general, es una parte de la aplicación completamente independiente. Manejan el ciclo de vida y el cambio de tamaño de las imágenes (una imagen se almacena/cambia de tamaño a diferentes tamaños). Hasta donde he visto, nunca fue implementado por una columna BLOB de SQL, sino por un archivo normal directo en el disco.

también echar un vistazo a un (infrastructure example from facebook)

general, el producto tiene que alinear a sus necesidades concretas (de tamaño de archivo, el número de archivos, carga). En la mayoría de los casos, realmente no quieres construir todo eso desde cero ... Aunque si tus requisitos son de gama baja (solo unos pocos usuarios suben archivos rara vez) podrías guardar estos archivos en el disco y guardar la ruta como referencia en sus otros datos (por ejemplo, columna en RDBMS).

3

Su pregunta es demasiado amplia para ser realmente útil; El mejor enfoque dependerá de sus requisitos específicos. No obstante ...

Los programadores están constantemente tentados a enviar archivos a la base de datos. Resistir. Simplemente agrega una capa de complejidad a todo lo que intenta hacer con ellos a partir de entonces.

Para mi experiencia, mientras usaba un hashkey como el nombre de archivo local era mi preferencia, realmente no funcionó porque nuestros archivos no estaban restringidos a las imágenes: las no imágenes necesitan un nombre de archivo para ser devuelto a los usuarios, y a los usuarios que suben videos no les gusta especialmente que se renombre radicalmente sus archivos, ya que les imposibilita saber qué archivo es qué.

En cuanto a las imágenes, hay algo de trabajo no trivial que hacer en el reajuste a varios tamaños/miniaturas.

+0

¿Por qué algunas personas ponen los archivos en una base de datos? Parece una muy mala idea, pero lo he escuchado sugerir algunas veces. ¿Tiene alguna ventaja? –

+2

Upside es un acoplamiento estricto entre el archivo y sus metadatos. –

Cuestiones relacionadas