Flaskで一時ディレクトリを作成し、ファイルをアップロードする

最近、プログラミングとブログの時間があまりとれなくて、十分に調べられていません。今回のコードと説明はかなり短く、備忘録として書いています。

ファイルの階層

├── app.py
└── templates
    └── upload.html

templates

upload.html
<form action="/upload" method="post" enctype="multipart/form-data" required>
    <input type="file" name="uploadfile">
    <input type="submit" value="アップロード">
</form>

ファイルをアップロードするには、formタグ内にenctype="multipart/form-data"が必要

app.py

app.py
from flask import Flask, render_template, request, session
from werkzeug.utils import secure_filename
import os
import tempfile
 
app = Flask(__name__)

# flaskでsessionを使うには、SECRET_KEYが必要
app.config.from_mapping(
    SECRET_KEY = 'dev'
)
 
@app.route('/')
def index():
    # 一時ディレクトリを作成
    # ルーティングで使えるように、sessionに一時ディレクトリのpathを代入
    session['tmpdir'] = tempfile.mkdtemp()

    return render_template('upload.html')
 
@app.route('/upload', methods=['POST'])
def upload():
    # アップロードされたファイルを代入
    file = request.files['uploadfile']

    # ファイル名をsecureな名前に
    file_name = secure_filename(file.filename)

    # 一時ディレクトリに保存
    file.save(os.path.join(session['tmpdir'], file_name))
 
    return '<h1>Complete</h1>'

if __name__ == '__main__':
    app.run(debug=True)

一時ディレクトリを削除

 import shutil
 shutil.rmtree(session['tmpdir'])

tempfile.mkdtemp()では、一時ディレクトリは自動で削除されないので、ルーティングのどこかで一時ディレクトリを削除するコードをいれます。

一時ファイル(ディレクトリ)の作成

一時ファイルやディレクトリを作成できるtempfileモジュールには、複数種類があるようです。少し触った感じだと、Flaskでファイルをアップロードするには、手動削除の方が使いやすいのかな?まだ、よくわかっていません。

作成先の確認

  • tempfile.gettempdir()

自動削除

  • ファイル
    • tempfile.TemporaryFile()
    • tempfile.NamedTemporaryFile()
  • ディレクトリ
    • tempfile.TemporaryDirectory()

手動削除

  • ファイル
    • tempfile.mkstemp()
  • ディレクトリ
    • tempfile.mkdtemp()