Django フレームワークでのファイル アップロード スキル

WBOY
リリース: 2023-06-18 08:24:06
オリジナル
4621 人が閲覧しました

近年、Web アプリケーションの人気が高まっており、その多くはファイルのアップロード機能を必要としています。 Djangoフレームワークではファイルをアップロードする機能の実装は難しくありませんが、実際の開発ではアップロードしたファイルに対してファイル名の変更やファイルサイズの制限などの処理を行う必要があります。この記事では、Django フレームワークでのファイル アップロード テクニックをいくつか紹介します。

1. 設定ファイルのアップロード項目
Django プロジェクトでファイルのアップロードを設定するには、settings.py ファイルで設定する必要があります。以下に、いくつかの重要な設定項目を紹介します。

  1. ファイル アップロード パス
    settings.py では、アップロードされたファイルを保存するパスを次のように定義できます:

    MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
    ログイン後にコピー

    この構成項目では、次のように定義します。アップロードされたファイルを保存するルート ディレクトリは Uploads で、メディア ファイルのパスは settings.py ファイルが配置されているディレクトリを基準にして計算されます。また、対応する URL ルールを Django プロジェクトの urls.py に追加して、ユーザーが URL にアクセスしてアップロードされたファイルを取得できるようにすることもできます。

  2. サポートされるファイル形式
    ファイル形式の制御は非常に重要な内容で、以下の設定項目でアップロードするファイルの形式を指定することができます。

    ALLOWED_FILE_TYPES = ['jpg', 'jpeg', 'png', 'gif', 'pdf']
    ログイン後にコピー

    すべてのファイル形式を小文字に変換する必要があることに注意してください。

  3. ファイル サイズ制限
    Django フレームワークは、デフォルトですべてのファイルのサイズを 2.5 MB 以下に制限します。この制限値を変更する必要がある場合は、settings.py 構成項目で変更できます。

    MAX_UPLOAD_SIZE = 10485760 # 10MB
    ログイン後にコピー

    この構成では、アップロード ファイルの最大サイズを 10MB に制限します。

2. ファイルのアップロード
Django フォーム コンポーネントを通じてファイルをアップロードできます。以下は、単純なファイル アップロード フォームの例です。

<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="document" accept=".pdf">
    <input type="submit" value="Submit">
</form>
ログイン後にコピー

ファイル アップロードをサポートするには、enctype 属性が multipart/form-data である必要があることに注意してください。

view 関数では、request.FILES.get() メソッドを使用して、アップロードされたファイルを取得できます。このメソッドはファイル オブジェクトを返します。簡単な例を次に示します。

def upload(request):
    if request.method == 'POST':
        file = request.FILES.get('document')
        if file:
            handle_uploaded_file(file)
            messages.success(request, '上传成功')
            return redirect('home')
        else:
            messages.error(request, '上传失败')
            return redirect('upload')
    else:
        return render(request, 'upload.html')
ログイン後にコピー

この例では、まずアップロードされたファイル オブジェクトを取得し、次に handle_uploaded_file() 関数を呼び出して、それを指定されたパスに保存します。ファイルがアップロードされていない場合は、メッセージ モジュールを通じてユーザーにエラー メッセージを表示できます。

3. ファイルの名前付け
サーバーにアップロードされたファイルをより適切に管理するために、アップロードされたファイルにタイムスタンプを含む一意のファイル名を付けることをお勧めします。簡単な例を次に示します。

def handle_uploaded_file(file):
    date = datetime.now().strftime("%Y%m%d%H%M%S")
    filename = f"{date}_{file.name}"
    path = os.path.join(MEDIA_ROOT, filename)
    with open(path, 'wb+') as destination:
        for chunk in file.chunks():
            destination.write(chunk)
ログイン後にコピー

まず、datetime モジュールを使用して現在の日付と時刻を取得し、それを文字列形式に変換します。次に、このタイムスタンプを元のファイル名と組み合わせて、新しいファイル名を生成します。最後に、新しいファイル名とアップロードされたファイルへのパスを組み合わせ、ファイル オブジェクトの chunks() メソッドを使用して、アップロードされたファイルの内容をファイルに書き込みます。

4. ファイル サイズ
サーバーの問題を防ぐために、アップロードされるファイルのサイズを制限する必要があります。以下は簡単なファイル サイズ チェック関数です:

def check_file_size(file):
    if file.size > MAX_UPLOAD_SIZE:
        raise ValidationError(f'上传文件大小最大为 {MAX_UPLOAD_SIZE / 1048576} MB')
ログイン後にコピー

この関数では、アップロードされたファイルのサイズが最大アップロード サイズを超えているかどうかをチェックします。それを超える場合は、ValidationError 例外がスローされ、ユーザーにプロンプ​​トが表示されます。この例外をビュー関数で処理します:

def upload(request):
    if request.method == 'POST':
        file = request.FILES.get('document')
        if file:
            try:
                check_file_size(file)
            except ValidationError as e:
                messages.error(request, e)
                return redirect('upload')
            else:
                handle_uploaded_file(file)
                messages.success(request, '上传成功')
                return redirect('home')
        else:
            messages.error(request, '上传失败')
            return redirect('upload')
    else:
        return render(request, 'upload.html')
ログイン後にコピー

この方法で、アップロードされるファイルのサイズをより適切に制御できます。

概要:

  1. Django フレームワークでファイル アップロードを実装するには、ファイル アップロード パスの定義、サポートされているファイル形式、ファイル サイズの制限など、特定の構成が必要です。
  2. ファイルのアップロードは Django フォーム コンポーネントを通じて実装され、ビュー関数は request.FILES.get() メソッドを通じてアップロードされたファイルを取得できます。
  3. ファイルをアップロードした後、ファイルの名前を変更し、タイムスタンプを使用して一意のファイル名を生成することをお勧めします。
  4. アップロードされるファイルのサイズを制限します。

以上がDjango フレームワークでのファイル アップロード スキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!