Return to Snippet

Revision: 34415
at September 1, 2011 06:07 by tclancy


Updated Code
import os

from django import forms
from django.conf import settings


class ValidatedFileField(forms.FileField):
    def __init__(self, file_extensions, content_types,
                 max_file_size=None, *args, **kwargs):
        super(ValidatedFileField, self).__init__(*args, **kwargs)
        self.file_extensions = [f.lower().replace('.', '')
                                for f in file_extensions]
        self.content_types = content_types
        self.max_file_size = max_file_size

    def clean(self, data, initial=None):
        from django.template.defaultfilters import filesizeformat
        if not data and initial:
            return initial
        f = super(ValidatedFileField, self).clean(data)
        if not f:
            return f
        if self.max_file_size and self.max_file_size < f.size:
            raise forms.ValidationError('Files cannot exceed %s in size' %
                                        filesizeformat(self.max_file_size))
        # not allowing files without an extension, really a preference thing
        if not f.name or f.name.find('.') == -1:
            raise forms.ValidationError('Does not appear to be a valid file')
        extension = os.path.splitext(f.name)[-1].lower().replace('.', '')
        if not extension in self.file_extensions or \
        not f.content_type in self.content_types:
            raise forms.ValidationError('Accepted file types: %s' %\
                                        ' '.join(self.file_extensions))
        return super(ValidatedFileField, self).clean(data)

Revision: 34414
at September 1, 2011 03:10 by tclancy


Updated Code
import os

from django import forms
from django.conf import settings


class ValidatedFileField(forms.FileField):
    def __init__(self, file_extensions, content_types,
                 max_file_size=None, *args, **kwargs):
        super(ValidatedFileField, self).__init__(*args, **kwargs)
        self.file_extensions = [f.lower().replace('.', '')
                                for f in file_extensions]
        self.content_types = content_types
        self.max_file_size = max_file_size

    def clean(self, data, *args, **kwargs):
        from django.template.defaultfilters import filesizeformat
        f = super(ValidatedFileField, self).clean(data)
        if not f:
            return f
        if self.max_file_size and self.max_file_size < f.size:
            raise forms.ValidationError('Files cannot exceed %s in size' %
                                        filesizeformat(self.max_file_size))
        # not allowing files without an extension, really a preference thing
        if not f.name or f.name.find('.') == -1:
            raise forms.ValidationError('Does not appear to be a valid file')
        extension = os.path.splitext(f.name)[-1].lower().replace('.', '')
        if not extension in self.file_extensions or \
        not f.content_type in self.content_types:
            raise forms.ValidationError('Accepted file types: %s' %\
                                        ' '.join(self.file_extensions))
        return f

Revision: 34413
at September 1, 2011 03:07 by tclancy


Updated Code
class ValidatedFileField(forms.FileField):
    def __init__(self, file_extensions, content_types,
                 max_file_size=None, *args, **kwargs):
        super(ValidatedFileField, self).__init__(*args, **kwargs)
        self.file_extensions = file_extensions
        self.content_types = content_types
        self.max_file_size = max_file_size

    def clean(self, data, *args, **kwargs):
        from django.template.defaultfilters import filesizeformat
        f = super(ValidatedFileField, self).clean(data)
        if not f:
            return f
        if self.max_file_size and self.max_file_size < f.size:
            raise forms.ValidationError('Files cannot exceed %s in size' %
                                        filesizeformat(self.max_file_size))
        # not allowing files without an extension, really a preference thing
        if not f.name or f.name.find('.') == -1:
            raise forms.ValidationError('Does not appear to be a valid file')
        if not os.path.splitext(f.name)[-1].lower() in self.file_extensions or \
        not f.content_type in self.content_types:
            raise forms.ValidationError('Accepted file types: %s' %\
                                        ' '.join(self.file_extensions))
        return f

Revision: 34412
at October 22, 2010 05:30 by tclancy


Updated Code
class ValidatedFileField(forms.FileField): 
    def __init__(self, file_extensions, content_types, max_file_size=None, *args, **kwargs): 
        super(ValidatedFileField, self).__init__(*args, **kwargs)
        self.file_extensions = file_extensions
        self.content_types = content_types
        self.max_file_size = max_file_size
    
    def clean(self, data, *args, **kwargs):
        from django.template.defaultfilters import filesizeformat
        f = super(ValidatedFileField, self).clean(data)
        if not f:
            return f
        if self.max_file_size and self.max_file_size < f.size:
            raise forms.ValidationError('Files cannot exceed %s in size' % filesizeformat(self.max_file_size))
        # not allowing files without an extension, really a preference thing
        if not f.name or f.name.find('.') == -1:
            raise forms.ValidationError('Does not appear to be a valid file')
        file_exts = MAINTENANCE_UPLOAD_FILE_EXTENSIONS
        if not splitext(f.name)[1].lower()[1:] in self.file_extensions or \
        not f.content_type in self.content_types: 
            raise forms.ValidationError('Accepted file types: %s' %\
                                        ' '.join(file_exts))
        return f

Revision: 34411
at October 22, 2010 04:43 by tclancy


Updated Code
class ValidatedFileField(forms.FileField): 
    def __init__(self, file_extensions, content_types, *args, **kwargs): 
        super(ValidatedFileField, self).__init__(*args, **kwargs)
        self.file_extensions = file_extensions
        self.content_types = content_types
    
    def clean(self, data, *args, **kwargs): 
        f = super(ValidatedFileField, self).clean(data)
        if not f:
            return f
        # not allowing files without an extension, really a preference thing
        if not f.name or f.name.find('.') == -1:
            raise forms.ValidationError('Does not appear to be a valid file')
        file_exts = MAINTENANCE_UPLOAD_FILE_EXTENSIONS
        if not splitext(f.name)[1].lower()[1:] in self.file_extensions or \
        not f.content_type in self.content_types: 
            raise forms.ValidationError('Accepted file types: %s' %\
                                        ' '.join(file_exts))
        return f

Revision: 34410
at October 22, 2010 04:41 by tclancy


Updated Code
class ValidatedFileField(forms.FileField): 
    def __init__(self, file_extensions, content_types, *args, **kwargs): 
        super(ValidatedFileField, self).__init__(*args, **kwargs)
        self.file_extensions = file_extensions
        self.content_types = content_types
    
    def clean(self, data, *args, **kwargs): 
        f = super(ValidatedFileField, self).clean(data)
        if not f:
            return f
        file_exts = MAINTENANCE_UPLOAD_FILE_EXTENSIONS
        if not splitext(f.name)[1].lower()[1:] in self.file_extensions or \
        not f.content_type in self.content_types: 
            raise forms.ValidationError('Accepted file types: %s' %\
                                        ' '.join(file_exts))
        return f

Revision: 34409
at October 22, 2010 04:38 by tclancy


Initial Code
class ValidatedFileField(forms.FileField): 
    def __init__(self, file_extensions, content_types, *args, **kwargs): 
        super(ValidatedFileField, self).__init__(*args, **kwargs)
        self.file_extensions = file_extensions
        self.content_types = content_types
    
    def clean(self, data, *args, **kwargs): 
        f = super(ValidatedFileField, self).clean(data)
        if not f:
            return f
        file_exts = MAINTENANCE_UPLOAD_FILE_EXTENSIONS
        if not splitext(f.name)[1].lower() in self.file_extensions or \
        not f.content_type in self.content_types: 
            raise forms.ValidationError('Accepted file types: %s' %\
                                        ' '.join(file_exts))
        return f

Initial URL
http://www.neverfriday.com/sweetfriday/2008/03/validating-file-uploads-with-d.html

Initial Description
Inspired by the linked code.

Initial Title
Django Validated Upload Field

Initial Tags


Initial Language
Python