Django 画像ファイルをアップロードした際に、その画像のファイル名を取得する方法 / アップロードしたときに古い画像を消す方法
受付中
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,575
画像をアップロードし、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"]
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
質問内容がぐちゃぐちゃでよくわかりませんが、ファイル名を取ってきたいなら
request.FILES
に入っていませんか。
どういう設計になっているかわからないので、何とも言えませんが
察するに、画像を削除したいなら、osライブラリから削除しましょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる