statics muestra mostrar manejo imagenes imagen guardar fondo python django pinax file-rename

python - muestra - ¿Imponer nombres de archivos de carga únicos usando django?



media django (5)

¿Cuál es la mejor manera de cambiar el nombre de las fotos con un nombre de archivo único en el servidor a medida que se cargan, usando django? Quiero asegurarme de que cada nombre se use solo una vez. ¿Hay alguna aplicación pinax que pueda hacer esto, tal vez con GUID?


¿Qué hay de concatenar el nombre del archivo con la fecha / hora en que se cargó la foto y luego usar hashlib para crear un resumen del mensaje? Eso debería darle nombres de archivo únicos.

Alternativamente, puede reutilizar un pequeño fragmento de código que crea nombres de archivo únicos y luego usar la ruta completa a ese archivo como entrada para su llamada hash. Eso le proporciona cadenas de longitud constante únicas que puede asignar a sus archivos.


Al momento de escribir esta respuesta, parece que ya no es necesario hacer nada especial para que esto suceda. Si configura un FileField con una propiedad estática upload_to, el sistema de almacenamiento Django administrará automáticamente los nombres de manera que si se carga un nombre de archivo duplicado, Django generará aleatoriamente un nuevo nombre de archivo único para el duplicado.

Funciona en Django 1.10.


Antes de Django 1.6.6, 1.5.9 y 1.4.14, la función get_avaialable_name le daría automáticamente a los archivos un nombre único al agregar un guión bajo. Entonces, por ejemplo, si guarda un archivo "test.jpg" y luego otro archivo, "test.jpg" en su servidor, el primero se llamará test.jpg y el segundo se llamará test_1.jpg.

Lamentablemente, eso resulta ser un vector para DDOS en una máquina, al enviarle miles de archivos de cero bytes para almacenar, cada uno verificando miles de archivos anteriores para ver cuál debería ser su nombre.

Como get_avaialable_name , el nuevo sistema agrega siete dígitos aleatorios después del subrayado para solucionar este problema.


Una mejor manera podría ser usar una clase común en su helpers.py. De esta manera, podría reutilizar el generador de archivos aleatorios en sus aplicaciones.

En su helpers.py:

import os import uuid from django.utils.deconstruct import deconstructible @deconstructible class RandomFileName(object): def __init__(self, path): self.path = os.path.join(path, "%s%s") def __call__(self, _, filename): # @note It''s up to the validators to check if it''s the correct file type in name or if one even exist. extension = os.path.splitext(filename)[1] return self.path % (uuid.uuid4(), extension)

Y luego en tu modelo solo importa la clase auxiliar:

from mymodule.helpers import RandomFileName

Y luego usarlo:

logo = models.ImageField(upload_to=RandomFileName(''logos''))

Ref: https://coderwall.com/p/hfgoiw/give-imagefield-uploads-a-unique-name-to-avoid-file-overwrites


Usa uuid. Para vincular eso a su modelo, consulte la documentación de Django para FileField upload_to.

Por ejemplo en su models.py define la siguiente función:

import uuid import os def get_file_path(instance, filename): ext = filename.split(''.'')[-1] filename = "%s.%s" % (uuid.uuid4(), ext) return os.path.join(''uploads/logos'', filename)

Luego, cuando defina su FileField / ImageField, especifique get_file_path como el valor upload_to .

file = models.FileField(upload_to=get_file_path, null=True, blank=True, verbose_name=_(u''Contact list''))