個人開発のWebアプリ**「まちかどルート」**v5.42への実装メモです。
まえがき
Rails 5.2のファイルアップローダーであるActive Storage環境下だとGoogle Cloud Visionのセーフサーチがうまく動かなかったので下記のように工夫しました。
具体的には画像ファイルを /public にいったん配置して、そのパスを指定して画像分析にかけ、終わったら /public から削除するという流れです。
# 画像の選択の有無を判断
if post_params[:image] != nil
# 画像を uploaded_file に格納
uploaded_file = post_params[:image]
# /public へのパスを指定
output_path = Rails.root.join('public', uploaded_file.original_filename)
# ファイルを開いて image_file に格納
image_file = File.open(output_path)
# Google Cloud VisionのAPIを使う
image_annotator = Google::Cloud::Vision::ImageAnnotator.new
response = image_annotator.safe_search_detection image: image_file
response.responses.each do |res|
safe_search = res.safe_search_annotation
# if文では公式ドキュメントと違って .to_s を付ける必要がありました
if safe_search.adult.to_s == "VERY_LIKELY" || safe_search.adult.to_s == "LIKELY"
flash[:error] = "不適切な画像と判断されました powered by Google Cloud Vision"
redirect_to root_path
return
elsif safe_search.violence.to_s == 'VERY_LIKELY' || safe_search.violence.to_s == 'LIKELY'
flash[:error] = "不適切な画像と判断されました powered by Google Cloud Vision"
redirect_to root_path
return
elsif safe_search.medical.to_s == 'VERY_LIKELY' || safe_search.medical.to_s == 'LIKELY'
flash[:error] = "不適切な画像と判断されました powered by Google Cloud Vision"
redirect_to root_path
return
end
end
# 最後に /public の画像ファイルを削除します
File.delete(output_path)
end
上記のコードを適所に書けばGoogle Cloud Visionのセーフサーチが機能します。そこでVERY_LIKELY
またはLIKELY
と判断されればroot_path
にリダイレクトされるようになります。
あとがき
Active Storage環境下だと公式ドキュメントどおりにやってもうまくいきませんでした。また、事前にgem 'google-cloud-vision', '~> 0.32.2'
をbundle install
したあとに「protobufが見つかりません」という内容のエラーが出ました。そこでGemfile
に gem 'google-protobuf', '~> 3.7.0.rc.2'
を追記のうえgem update google-protobuf
を実行することで回避できました。
こちらの記事も合わせてどうぞ。
【Rails】Active Storage + S3 + Active JobでGoogle Cloud Visionセーフサーチ