画像をアップロードし、Google Cloud Vision APIでアップロードした画像からテキストを抽出するwebアプリの実装をDjangoで目指しています。
<結論:質問したいこと>
imageFieldを使ってアップロードした画像のファイル名の取得方法が知りたいです。
具体的にコードをどう書くサンプルがあると大変助かります。
<以下詳細>
画像アップロードのページはできました。
しかし、api google visionを含めるところでつまづいています。
実装の参考サイトは以下です。
https://qiita.com/AltGuNi/items/6f22f1441733da08fdc1
上記URL内にある全体コード
import requests import base64 import json GOOGLE_CLOUD_VISION_API_URL = 'https://vision.googleapis.com/v1/images:annotate?key=' API_KEY = 'APIキー' # 取得したAPIキーを入力してください。 # APIを呼び、認識結果をjson型で返す def request_cloud_vison_api(image_base64): api_url = GOOGLE_CLOUD_VISION_API_URL + API_KEY req_body = json.dumps({ 'requests': [{ 'image': { 'content': image_base64.decode('utf-8') # jsonに変換するためにstring型に変換する }, 'features': [{ 'type': 'TEXT_DETECTION', # ここを変更することで分析内容を変更できる 'maxResults': 10, }] }] }) res = requests.post(api_url, data=req_body) return res.json() # 画像読み込み def img_to_base64(filepath): with open(filepath, 'rb') as img: img_byte = img.read() return base64.b64encode(img_byte) # 文字認識させたい画像を./img.pngとする img_base64 = img_to_base64('./img.png') result = request_cloud_vison_api(img_base64) #認識した文字の位置など、すべての情報を出力 #print("{}".format(json.dumps(result, indent=4))) #認識した文字のみを出力 text_r = result["responses"][0]["fullTextAnnotation"]["text"] print(text_r)
画像読み込みのコード箇所
# 画像読み込み def img_to_base64(filepath): with open(filepath, 'rb') as img: img_byte = img.read() return base64.b64encode(img_byte) # 文字認識させたい画像を./img.pngとする img_base64 = img_to_base64('./img.png') result = request_cloud_vison_api(img_base64)
上記コードのfilepathと'./img.png'を渡すところでアップロードした画像のファイル名を入れたいと思っています。
「画像のアップロード(imageField)」の実装は以下サイトを参考にしています。
https://qiita.com/narupo/items/e3dbdd5d030952d10661
modelで設定したimageFieldの引数からfilenameは取得できないのでしょうか。
また、別の質問があります。
画像をアップロードするとすべて保存されて、データベースやメディアフォルダに画像が溜まっていってしまいます。
それをなくすために、アップロードした際か、webページを閉じた際に古い画像をすべて消したいのですが、可能でしょうか。データベースやメディアフォルダ内にはそのとき、アップロードした画像だけが残る状態がベストで、違う画像をアップロードした場合は、その画像が保存され、前の画像が削除されるイメージです。アップロードでなくても、webページを閉じたときにも、一度クリアされるのが理想です。
image.objects.all().delete()やos.remove()、shutil.rmtree()を使ってみましたが、アップロードした画像が保存されず、全部削除されてしまいます。image.objects.all().delete()やos.remove()、shutil.rmtree()をコードで指定した後に、image.save()をしましたが、うまくできません。
何か方法はありますでしょうか。
宜しくお願い致します。
念の為、いま、実装してview.pyのコードを記載します。
view.py
from django.shortcuts import render, redirect from .forms import PhotoForm from .models import Photo from django.views.generic import TemplateView import requests import base64 import json class OcrTemplate(TemplateView): def index(request): if request.method == 'POST': form = PhotoForm(request.POST, request.FILES) if form.is_valid(): return redirect('index') photo = Photo() photo.image = form.cleaned_data['image'] photo.save() else: form = PhotoForm() photos = Photo.objects.all() return render(request, 'ocr_app/index.html', { 'form': form, 'photos': photos }) # APIを呼び、認識結果をjson型で返す def request_cloud_vison_api(image_base64): GOOGLE_CLOUD_VISION_API_URL = 'https://vision.googleapis.com/v1/images:annotate?key=' API_KEY = '' # 取得したAPIキーを入力してください。 api_url = GOOGLE_CLOUD_VISION_API_URL + API_KEY req_body = json.dumps({ 'requests': [{ 'image': { 'content': image_base64.decode('utf-8') # jsonに変換するためにstring型に変換する }, 'features': [{ 'type': 'TEXT_DETECTION', # ここを変更することで分析内容を変更できる 'maxResults': 10, }] }] }) res = requests.post(api_url, data=req_body) return res.json() # 画像読み込み def img_to_base64(filepath): with open(filepath, 'rb') as img: img_byte = img.read() return base64.b64encode(img_byte) # 文字認識させたい画像を./img.pngとする img_base64 = img_to_base64('./img.png') result = request_cloud_vison_api(img_base64) #認識した文字の位置など、すべての情報を出力 #print("{}".format(json.dumps(result, indent=4))) #認識した文字のみを出力 text_r = result["responses"][0]["fullTextAnnotation"]["text"]

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。