質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Q&A

解決済

1回答

5187閲覧

SQLiteに画像を保存したい

Kta0000

総合スコア3

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

0グッド

0クリップ

投稿2022/11/16 10:09

編集2022/11/16 10:11

前提

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を操作しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuma.inaura

2022/11/16 11:32

>よく分かりません 具体的にはどんな問題が起きているんでしょうか
guest

回答1

0

ベストアンサー

ファイルアップロードのExampleは以下にあります。
やさしいイントロダクション

これは微妙に優しくないので、若干書き直したものを以下に記載します。
DBに入れるのは、とりあえずbase64フォーマットにでもすれば入る事は入ると思います。

python

1# app.py 2from flask import Flask, flash, request, redirect, url_for, render_template 3import base64 4 5 6UPLOAD_FOLDER = './static' 7ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} 8 9app = Flask(__name__) 10 11app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 12 13 14def allowed_file(filename): 15 return '.' in filename and \ 16 filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS 17 18 19@app.route('/', methods=['GET', 'POST']) 20def upload_file(): 21 if request.method == 'POST': 22 # check if the post request has the file part 23 if 'file' not in request.files: 24 flash('No file part') 25 return redirect(request.url) 26 file = request.files['file'] 27 # If the user does not select a file, the browser submits an 28 # empty file without a filename. 29 if file.filename == '': 30 flash('No selected file') 31 return redirect(request.url) 32 if file and allowed_file(file.filename): 33 img_base64 = base64.b64encode(file.read()) 34 print(img_base64) 35 return redirect(url_for('upload_file')) 36 return render_template('index.html') 37 38 39if __name__ == '__main__': 40 app.run() 41

html

1<!-- templates/index.html --> 2<!DOCTYPE html> 3<html lang="ja"> 4<head> 5 <meta charset="UTF-8"> 6 <title>Upload new File</title> 7</head> 8<body> 9 <h1>Upload new File</h1> 10 <form method=post enctype=multipart/form-data> 11 <input type="file" name="file"> 12 <input type="submit" value="Upload"> 13 </form> 14</body> 15</html>

わからないだらけだったので、具体的に例を書きましたが、もし理解できないようでしたら、PythonやFlaskの勉強をし直した方が良いと思います。
今後も躓くことになると思いますので、勉強しに戻っても時間が無駄になることはありません。

また、質問文でimportされている以下は不要のはずです。

python

1from sqlalchemy import create_engine

Flask_SQLAlchemyがimportされているので、Flask_SQLAlchemyを使っているものと思いますが、Flask_SQLAlchemyを使っている場合、SQLAlchemyを意識せずに使用可能です。
参考とするドキュメントが間違っているか、理解が間違っている可能性があります。
公式ドキュメントを参考に記述方法を再確認した方が良いです。

投稿2022/11/16 12:46

FiroProchainezo

総合スコア2421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kta0000

2022/12/08 07:52

大変申し訳ございません。FiroProchainezo 様。回答に気づきませんでした。画像データをbase64フォーマットを用いてDBに保存することが出来ました。ありがとうございます。 もう一つお伺いしても良いでしょうか。 DBに保存したデータを取り出して、htmlに渡して表示するにはどうしたらよいのでしょうか。 デコードが必要なのは分かるのですが、どのようにhtmlにわたして、htmlではどう表示したら良いのでしょうか。<img src="???"> ???の部分にどう入れたら良いのでしょうか。
Kta0000

2022/12/08 15:51

ありがとうございます。解決しました。ご連絡が遅くなってしまったのにもかかわらず、すぐにご返信くださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問