0 Tage Serie
python / intermediate
Snippet

Django Dateiuploads mit ImageField Validierung

Dateiuploads erfordern mehrere Validierungsschichten: Magic-Byte-Erkennung verhindert Extension-Spoofing, Größenlimits verhindern Speicher-Missbrauch, und Dimensionsprüfungen stellen sicher dass Bilder Anforderungen erfüllen.

snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from django import forms
from django.core.exceptions import ValidationError
import magic
class ProfilePictureForm(forms.Form):
picture = forms.ImageField()
def clean_picture(self):
image = self.cleaned_data['picture']
# Validate file type using magic bytes
mime_type = magic.from_buffer(image.read(1024), mime=True)
image.seek(0) # Reset file pointer after reading
allowed_types = ['image/jpeg', 'image/png', 'image/webp']
if mime_type not in allowed_types:
raise ValidationError('Unsupported file format')
# Validate file size (max 5MB)
if image.size > 5 * 1024 * 1024:
raise ValidationError('Image size cannot exceed 5MB')
# Validate dimensions
img = Image.open(image)
if img.width < 200 or img.height < 200:
raise ValidationError('Image must be at least 200x200 pixels')
return image
django
Erklärung
1
magic.from_buffer()
Erkennt echten MIME-Typ durch Lesen der Datei-Magic-Bytes
2
image.size
Dateigröße in Bytes vom hochgeladenen File-Objekt
3
Image.open(image)
PIL/Pillow validiert echte Bildabmessungen