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

前端 未结 10 689
日久生厌
日久生厌 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:30

    One very easy way is to use a custom validator.

    In your app's validators.py:

    def validate_file_extension(value):
        import os
        from django.core.exceptions import ValidationError
        ext = os.path.splitext(value.name)[1]  # [0] returns path+filename
        valid_extensions = ['.pdf', '.doc', '.docx', '.jpg', '.png', '.xlsx', '.xls']
        if not ext.lower() in valid_extensions:
            raise ValidationError('Unsupported file extension.')
    

    Then in your models.py:

    from .validators import validate_file_extension
    

    ... and use the validator for your form field:

    class Document(models.Model):
        file = models.FileField(upload_to="documents/%Y/%m/%d", validators=[validate_file_extension])
    

    See also: How to limit file types on file uploads for ModelForms with FileFields?.

    Warning

    For securing your code execution environment from malicious media files

    1. Use Exif libraries to properly validate the media files.
    2. Separate your media files from your application code execution environment
    3. If possible use solutions like S3, GCS, Minio or anything similar
    4. When loading media files on client side, use client native methods (for example if you are loading the media files non securely in a browser, it may cause execution of "crafted" JavaScript code)

提交回复
热议问题