第9章 アップロード
1 app.py(表示)
画像をアップロードできるようにしてみましょう。まず、app.py に /uploadの画面を表示する関数 upload_get を作成し、upload.htmlを表示します。
@app.get('/upload')
def upload_get():
return render_template("upload.html")
2 upload.html
次にupload.htmlに投稿フォームを作成します。送信先は /upload とします。このとき、enctypeを指定しないとアップロードできません。
form内の部品はファイルアップロード(input type="file")と本文のテキストエリア(name=mes)のみです。ただ、その下にアップロードした画像をプレビュー表示するためのimgタグを追加します。
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="upfile" id="imagebtn"><br>
<div><img id="preview" src="" alt="画像プレビュー"></div>
<textarea name="mes"></textarea><br>
<input type="submit" value="アップロード">
</form>
<script src="/static/preview.js"></script>
最後にJavaScriptで画像を指定したときにプレビュー画面にプレビューを出すようにしています。
3 style.css
staticフォルダにあるstyle.cssにスタイルを設定します。 画像プレビューは初期状態では非表示にします。400pxの幅で表示します。
#preview {
display: none;
max-width: 400px;
margin: 1em;
border: 1px solid #ccc;
}
本文の入力エリアは30文字×6行にします。
textarea{
width: 30em;
height:6em;
display: block;
}
4 app.py(アップロード処理)
次にapp.py に投稿処理を行う uppload_post関数を作成します。
@app.post('/upload')
def upload_post():
# アップロードファイルの保存
file = request.files['upfile']
fname = str(uuid.uuid4()) + ".jpg"
file.save(os.path.dirname(__file__) + '/static/' + fname)
# データベース保存
t = Toukou(
uid = session['uid'],
image = fname,
mes = request.form['mes'],
)
db.session.add(t)
db.session.commit()
return redirect('/')
アップロードしたファイルはrequest.files['upfile']で取得します。これを file.save(パス) で保存します。
ファイル名はuuidという仕組みでランダムな名前を生成します。これに拡張子.jpgを付けて、このapp.pyファイル配下のstaticフォルダに保存します。
この情報をデータベースに保存し、トップページにリダイレクトします。 ユーザIDはセッションから取得します。 実際にログイン、投稿して確認します。