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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1705閲覧

Django 画像ファイルをアップロードした際に、その画像のファイル名を取得する方法 / アップロードしたときに古い画像を消す方法

Tsuyoshi777

総合スコア16

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/01 02:40

画像をアップロードし、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"]

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

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

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

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

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

guest

回答1

0

質問内容がぐちゃぐちゃでよくわかりませんが、ファイル名を取ってきたいなら
request.FILES
に入っていませんか。

どういう設計になっているかわからないので、何とも言えませんが
察するに、画像を削除したいなら、osライブラリから削除しましょう。

投稿2019/07/03 07:42

yamato_user

総合スコア2321

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問