1. ホーム
  2. django

[解決済み] サーバーサイドのFileFieldで特定のファイルタイプのみを受け付けるようにする

2023-01-19 11:26:50

質問

どのようにすれば FileField を制限して、特定の種類のファイル (ビデオ、オーディオ、pdf など) のみを受け入れるようにするには、サーバー側で洗練された方法を使用できますか?

どのように解決するのですか?

非常に簡単な方法の1つは、カスタムバリデータを使用することです。

あなたのアプリの 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.')

次に models.py :

from .validators import validate_file_extension

... そして、フォームフィールドにバリデータを使用します。

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

こちらもご覧ください。 FileFields を持つ ModelForms のファイルアップロードでファイルタイプを制限する方法は? .

警告

悪意のあるメディアファイルからコード実行環境を保護するために

  1. Exif を使用する ライブラリ を使用して、メディアファイルを適切に検証します。
  2. メディアファイルをアプリケーションコードから分離する 実行環境から分離します。
  3. 可能であれば、S3、GCS、Minio などのソリューションを使用する。 のようなソリューションを使用します。
  4. クライアント側でメディア ファイルを読み込むときは、クライアント ネイティブのメソッドを使用します (たとえば、ブラウザでメディア ファイルを非安全に読み込んでいる場合は ブラウザでメディア ファイルを安全に読み込む場合、細工された JavaScript コードが実行される可能性があります)。