Only accept a certain file type in FileField, server-side

前端 未结 10 645
日久生厌
日久生厌 2020-11-27 02:56

How can I restrict FileField to only accept a certain type of file (video, audio, pdf, etc.) in an elegant way, server-side?

10条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-11-27 03:22

    There's a Django snippet that does this:

    import os
    
    from django import forms
    
    class ExtFileField(forms.FileField):
        """
        Same as forms.FileField, but you can specify a file extension whitelist.
    
        >>> from django.core.files.uploadedfile import SimpleUploadedFile
        >>>
        >>> t = ExtFileField(ext_whitelist=(".pdf", ".txt"))
        >>>
        >>> t.clean(SimpleUploadedFile('filename.pdf', 'Some File Content'))
        >>> t.clean(SimpleUploadedFile('filename.txt', 'Some File Content'))
        >>>
        >>> t.clean(SimpleUploadedFile('filename.exe', 'Some File Content'))
        Traceback (most recent call last):
        ...
        ValidationError: [u'Not allowed filetype!']
        """
        def __init__(self, *args, **kwargs):
            ext_whitelist = kwargs.pop("ext_whitelist")
            self.ext_whitelist = [i.lower() for i in ext_whitelist]
    
            super(ExtFileField, self).__init__(*args, **kwargs)
    
        def clean(self, *args, **kwargs):
            data = super(ExtFileField, self).clean(*args, **kwargs)
            filename = data.name
            ext = os.path.splitext(filename)[1]
            ext = ext.lower()
            if ext not in self.ext_whitelist:
                raise forms.ValidationError("Not allowed filetype!")
    
    #-------------------------------------------------------------------------
    
    if __name__ == "__main__":
        import doctest, datetime
        doctest.testmod()
    

提交回复
热议问题