前提
pythonのflaskで、日記のようなアプリを開発しようとしています。
実現したいこと
SQLiteに画像を保存したいが、保存の仕方がよく分からない。
インターネットには画像データをバイナリーデータに変換して保存すると書いてありましたが、よく分かりません。
pythonでの画像の受け取り方に問題があるのか、htmlでのアップロード方法に問題があるのかも分かりません。
発生している問題・エラーメッセージ
TypeError: expected str, bytes or os.PathLike object, not FileStorage
該当のソースコード
python
1from flask import Flask, request, render_template 2from flask_sqlalchemy import SQLAlchemy 3from sqlalchemy import create_engine 4 5from PIL import Image 6from io import BytesIO 7import cgi 8import sys 9import io 10import requests 11 12一部省略 13 14class Post(db.Model): 15 __tablename__ = 'records' 16 id = db.Column(db.Integer, primary_key=True) 17 name = db.Column(db.Text) 18 date = db.Column(db.Text) 19 score = db.Column(db.Integer) 20 review = db.Column(db.Text) 21 image = db.Column(db.BLOB) 22 23@app.route('/create', methods=['POST']) 24def create_post(): 25 26 message = 'create your memo' 27 28 new_post = Post() 29 new_post.name = request.form['title'] 30 new_post.date = request.form['date'] 31 new_post.score = request.form['score'] 32 new_post.review = request.form['content'] 33 # 画像を取得 34 img = request.files['image'] 35 # 画像をbyteに変換 36 f = open(img, 'br') 37 bin = f.read() 38 img_bytes = base64.b64encode(bin) 39 new_post.image= img_bytes 40 db.session.add(new_post) 41 db.session.commit() 42 43 posts = Post.query.all() 44 45 return render_template('post_list.html', message = message, posts = posts)
html
1{% extends 'layout.html' %} 2{% block content %} 3 <h1>{{ message }}</h1> 4 <form action="/create" method="post" enctype="multipart/form-data"> 5 <label for="title">キャンプ場名</label><br> 6 <input type="text" name="title" value=""> 7 <p></p> 8 <label for="date">日付</label><br> 9 <input type="date" name="date"> 10 <p></p> 11 <label for="score">評価</label> 12 <input type="range" min="1" max="5" step="0.5" value="" name="score" class="input-range" /> 13 <p></p> 14#写真のアップロード 15 <label for="image">写真</label> 16 <input type="file" name="image" accept="image/png, image/jpeg"> 17 <p></p> 18 <label for="content">感想</label><br> 19 <textarea name="content" cols="40" rows="10"></textarea> 20 <p></p> 21 <button type="submit">保存する</button> 22 <a href='/'>キャンセル</a> 23 </form>
試したこと
画像取得の部分でrequest.form['image']としましたがダメでした。
補足情報(FW/ツールのバージョンなど)
SQLAlchemyをつかってSQLiteを操作しています。
回答1件
あなたの回答
tips
プレビュー