はじめに
flask でファイルをアップロードするための簡単な web ページを作成したときのメモ
使用した python のバージョンは 3.5 です。
ソースコード
使用したモジュール
import os
# request フォームから送信した情報を扱うためのモジュール
# redirect ページの移動
# url_for アドレス遷移
from flask import Flask, request, redirect, url_for
# ファイル名をチェックする関数
from werkzeug.utils import secure_filename
# 画像のダウンロード
from flask import send_from_directory
初期設定
コードが保存されているディレクトリと同じ階層にuploads
というディレクトリを用意します。
これは、アップロードされたファイルを保存するためのディレクトリです。
# 画像のアップロード先のディレクトリ
UPLOAD_FOLDER = './uploads'
# アップロードされる拡張子の制限
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'gif'])
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
拡張子の確認
アップロードされたファイルの拡張子があるかどうか、拡張子が正しいかどうかを確認するための関数を追加します。
def allwed_file(filename):
# .があるかどうかのチェックと、拡張子の確認
# OKなら1、だめなら0
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
ファイルのアップロード
返り値に html を返すことで、web ページにレイアウトを追加しています。
# ファイルを受け取る方法の指定
@app.route('/', methods=['GET', 'POST'])
def uploads_file():
# リクエストがポストかどうかの判別
if request.method == 'POST':
# ファイルがなかった場合の処理
if 'file' not in request.files:
flash('ファイルがありません')
return redirect(request.url)
# データの取り出し
file = request.files['file']
# ファイル名がなかった時の処理
if file.filename == '':
flash('ファイルがありません')
return redirect(request.url)
# ファイルのチェック
if file and allwed_file(file.filename):
# 危険な文字を削除(サニタイズ処理)
filename = secure_filename(file.filename)
# ファイルの保存
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
# アップロード後のページに転送
return redirect(url_for('uploaded_file', filename=filename))
return '''
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>
ファイルをアップロードして判定しよう
</title>
</head>
<body>
<h1>
ファイルをアップロードして判定しよう
</h1>
<form method = post enctype = multipart/form-data>
<p><input type=file name = file>
<input type = submit value = Upload>
</form>
</body>
'''
##アップロードされたファイルの処理
url にはアップロードされたファイルの名前を指定しています
画像を返すことでアップロードされたファイルの表示をしています
@app.route('/uploads/<filename>')
# ファイルを表示する
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
実行
set FLASK_APP=predictfile.py
python -m flask run
* Serving Flask app "predictfile.py"
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
アップロード前
アップロード後