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

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

ただいまの
回答率

88.34%

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,461

Tsuyoshi777

score 16

画像をアップロードし、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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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