¿Cuál es la mejor práctica para nombrar las imágenes cargadas?

14

Supongamos que tengo un formulario en mi aplicación web donde los usuarios pueden cargar una imagen de perfil.

Tengo algunos requisitos sobre el tamaño del archivo, las dimensiones, etc., pero cuando el usuario carga la imagen, ¿cómo debo nombrarla en mi sistema? Supongo que tendría que ser coherente y también único.

¿Tal vez un GUID?

a5c627bedc3c44b7ae7c06a44fb3fcf8.jpg

¿Una marca de tiempo?

129899740140465735.jpg

¿Un hash? Ej: md5

b1a9acaf295cf14ffbc5b6538294562c.jpg

¿Hay una forma estándar o recomendada de hacer esto?

    
pregunta Rowan Freeman 04.04.2013 - 08:03

5 respuestas

27

Debes intentar cumplir dos objetivos: singularidad y utilidad.

El uso de un GUID garantiza la exclusividad, pero un día los archivos pueden separarse de su fuente original, y entonces estará en problemas.

Mi solución típica es incrustar información crucial en el nombre de archivo, como el ID de usuario (si pertenece a un usuario) o la fecha y hora cargada (si esto es importante), o el nombre de archivo utilizado al subirlo.

Esto puede realmente salvar tu skin un día, cuando la información incrustada en el nombre del archivo te permite, por ejemplo, recuperarte de un error o la eliminación accidental de registros. Si todo lo que tienes son GUIDs y pierdes el catálogo, tendrás un excelente trabajo limpiando eso.

Por ejemplo, si un archivo "My Holiday: Florida 23.jpg" se carga, mediante el ID de usuario 98765, el 4 de abril de 2013 a las 12:51:23 lo nombraría así, agregando una cadena aleatoria ad8a7dsf9 :

20130404125123-ad8a7dsf9-98765-my-holiday-florida-23.jpg

  • La singularidad está garantizada por la fecha y la hora, y la cadena aleatoria (siempre que sea correctamente aleatoria desde / dev / urandom o CryptGenRandom.
  • Si alguna vez se separa el archivo, puede identificar al usuario, la fecha y la hora y el título.
  • Todo se pliega a minúsculas y todo lo que no sea alfanumérico se elimina y se reemplaza por guiones, lo que hace que el nombre del archivo sea fácil de usar con herramientas simples (por ejemplo, sin espacios que puedan confundir los guiones mal escritos, sin dos puntos u otros caracteres que están prohibidos). en algunos sistemas de archivos, y así sucesivamente).
respondido por el Ben 04.04.2013 - 09:34
4

No desea enfatizar las aplicaciones (como Explorer) y hacer que se bloquee cuando abre el directorio. Si bien es poco probable que estreses el sistema de archivos real, debes tener esto en cuenta si vas a almacenar miles de archivos.

Si está esperando almacenar miles de archivos, mi sugerencia es particionar en carpetas. Por ejemplo, upload\silo001 , upload\silo002 , etc. Puede equilibrar sus archivos o esperar hasta que una carpeta llegue a un cierto número de archivos y luego crear otro.

Con respecto a la denominación, siempre nombro un archivo con un GUID porque es globalmente único. Extraigo la extensión de la carga y configuro la extensión del archivo para que coincida, pero el nombre real se establece a partir de un nuevo Guid.

Si está haciendo esto junto con un RDBMS y tiene varias categorías, es decir, productos, categorías, etc., podría tener upload\products , upload\categories , etc., y podría usar el ID de fila como nombre de archivo .

En cuanto a las mejores prácticas, yo también he buscado en el pasado y no he encontrado nada. Se me ocurrió lo anterior mientras discutía con algunos de mis desarrolladores.

    
respondido por el Sam 04.04.2013 - 08:12
2

En una de las soluciones en las que trabajé hace años, hicimos esto: subcarpetas para parte de la ID de usuario, por lo que si su ID de usuario era 232950192

tendríamos subcarpetas imágenes / 23/29/50/192/232950192

en la carpeta final, tenemos carpetas para albuns e imágenes de perfil, etc.

Pero también guardamos todo en la base de datos y lo guardamos en el sistema de archivos para un acceso rápido al servidor web (que también tiene almacenamiento en caché)

De todos modos, la imagen final tendría el nombre de la imagen original. No necesitamos mantener las versiones. Pero para qué puede mantener más subcarpetas bajo los nombres finales del álbum o en la base de datos con un id de versión. hay que pensar en ello, ya que una vez que llegue a la producción sería difícil cambiar las cosas sin mucho tiempo y correcciones propensas a errores en la estructura actual

Es muy fácil crear una subcarpeta en java y crear un archivo en ella:

    File folder = new File(pathwithslashes);// like "images/23/29/50/192/232950192"
    folder.mkdirs();
    File imgFile = new File(folder, name);
    //Now get output stream etc

Para obtener sello de fecha en subcarpetas:         SimpleDateFormat sdf = new SimpleDateFormat ("/ aaaa / MM / dd /");         pathwithslashes = pathwithslashes + sdf.format (now); // ahora es un util.Date         Carpeta de archivos = nuevo archivo (pathwithslashes);

Dot net enlace

    
respondido por el tgkprog 23.05.2017 - 13:33
1

Recomiendo usar solo md5 o algo conceptualmente equivalente. Al cambiar el nombre de los archivos mediante el resumen de sus contenidos, no solo otorga unicidad (siempre almacene las imágenes en caché el mayor tiempo posible, y con el cambio de nombre basado en el contenido, bueno, con la imagen adecuada, puede almacenar las imágenes prácticamente siempre).

Además, no es un gran problema, pero sin embargo, no es un caso hipotético puro cuando diferentes usuarios cargan exactamente la misma imagen. Una vez que esté listo, tendrá una pequeña optimización de almacenamiento de datos.

En cuanto a cualquier otra cosa propuesta: en cuanto a mí, soy un fuerte oponente de mantener cualquier tipo de información auxiliar en un nombre de archivo. Cuando era mucho más joven (y un poco más delgado :), he sido un desarrollador de Perl y tenía el dudoso hábito de almacenar tanta información auxiliar en el nombre del archivo como me lo permitió el sentido común, ya que las características de los patrones de cadena de Perl son increíbles. Y llegué a la conclusión de que, hablando de desarrollo web, es siempre la mejor opción para mantener los datos asociados con el archivo por separado del nombre del archivo.

Tenga en cuenta que hoy en día, cuando las interfaces móviles están dominando, el nombre real del archivo es algo menos importante que hace 5, 10 años. Pero incluso si esto es crucial en el contexto de su aplicación, siempre puede involucrar algo de magia de la vieja escuela con la participación de Content-Disposition: attachment; filename="pretty_file_name.jpg" encabezado HTTP, construyendo cualquier nombre de archivo relevante que desee. Además, los navegadores modernos están allanando el camino para el nuevo atributo HTML5, descargar . No creo que ver el nombre de la imagen "legible por humanos" sea algo en lo que debería pensar en la mayoría de los casos.

UPD: Se puede hacer una modificación para no tener demasiados archivos en un directorio, solo tome las 3 primeras letras y cree el directorio.

    
respondido por el shabunc 04.04.2013 - 10:16
-1

Las posibilidades de colisiones con algo como sha4 son infinitesimales. Si combina el hash con el ID de usuario o incluso una fecha simple, menos aún.

    
respondido por el Evan Zamir 25.08.2017 - 23:27

Lea otras preguntas en las etiquetas