django - muestra - subir imagenes con python
Tamaño máximo de la imagen en la carga del archivo (3)
Tengo un ImageField en mi forma. ¿Cómo forzaría un tamaño de archivo min / max, algo así como -
image = forms.ImageField(max_size = 2MB)
o
image = forms.ImageField(min_size = 100k)
Gracias.
Aquí hay otra opción que no vi en las variaciones de esta pregunta en : use un validador personalizado en sus modelos. Si utiliza esta técnica y un ModelForm en forms.py, esto debería ser todo lo que necesita.
models.py
from django.core.exceptions import ValidationError
class Product(models.Model):
def validate_image(fieldfile_obj):
filesize = fieldfile_obj.file.size
megabyte_limit = 5.0
if filesize > megabyte_limit*1024*1024:
raise ValidationError("Max file size is %sMB" % str(megabyte_limit))
image = models.ImageField(upload_to="/a/b/c/", validators=[validate_image])
Básicamente, este es un duplicado del límite de tamaño de carga del archivo Django
Tienes dos opciones:
Use la validación en Django para verificar el tamaño del archivo cargado. El problema con este enfoque es que el archivo debe cargarse por completo antes de validarlo. Esto significa que si alguien sube un archivo de 1TB, probablemente se quede sin espacio en el disco duro antes de que el usuario obtenga un error de formulario.
Configure el servidor web para limitar el tamaño de cuerpo de carga permitido. por ejemplo, si usa Apache, establezca la configuración
LimitRequestBody
. Esto significa que si un usuario intenta cargar demasiado, obtendrá una página de error configurable en Apache
Como @pastylegs dice en los comentarios, usar una combinación de ambos es probablemente el mejor enfoque. Digamos que quiere un máximo de 5 MB, tal vez imponga un límite de 20 MB en el nivel del servidor web y el límite de 5 MB en el nivel Django. El límite de 20 MB proporcionaría cierta protección contra los usuarios malintencionados, mientras que el límite de 5 MB en Django ofrece un buen UX.
models.py
class Product(models.Model):
image = models.ImageField(upload_to="/a/b/c/")
forms.py
class ProductForm(forms.ModelForm):
# Add some custom validation to our image field
def clean_image(self):
image = self.cleaned_data.get(''image'', False)
if image:
if image._size > 4*1024*1024:
raise ValidationError("Image file too large ( > 4mb )")
return image
else:
raise ValidationError("Couldn''t read uploaded image")