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

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

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

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

1回答

2203閲覧

s3に保存されている画像のEXIFをexifrで読み込みたい

cerry

総合スコア6

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

0クリップ

投稿2020/01/17 21:39

railsで画像のexifファイルをexifrで取得する機能を実装しています
ローカルに保存されている画像のexifは読み込めるのですが、
本番環境のAWSs3に保存してある画像のExifを読み込むことに苦戦しています。

exiferの記述は、

if Rails.env == 'production' @exif = EXIFR::JPEG.new(@post.picture.url) else @exif = EXIFR::JPEG.new(Rails.root.to_s+"/public/#{@post.picture.url}") end

としていて、この状態でデプロイするとrailsのエラーが発生します。
ログを確認すると

Errno::ENOENT (No such file or directory @ rb_sysopen - https://app-bucket.s3.amazonaws.com/uploads/micropost/picture/9/flower.jpg):

との記述が見つかったのですが、このパス配下に画像は存在しています。
画像のアップロードはcarriawaveで行なっており、
carriawave.rbは

require 'carrierwave/storage/abstract' require 'carrierwave/storage/file' require 'carrierwave/storage/fog' CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:].\-+]/ CarrierWave.configure do |config| config.storage :fog config.fog_provider = 'fog/aws' config.fog_directory = "app-bucket" config.fog_credentials = { provider: 'AWS', aws_access_key_id: Rails.application.credentials.dig(:aws, :access_key_id), aws_secret_access_key: Rails.application.credentials.dig(:aws, :secret_access_key), region: Rails.application.credentials.dig(:aws, :region), path_style: true } end

と記述しています。
どこかs3の設定やパスの指定が間違っているのでしょうか?
もしくは、
exifrはローカルファイルのexif情報しか取得できないのでしょうか?
アドバイスをいただきたいです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

前回も指摘しましたが EXIFR::JPEG.new(file) のfile は ファイルのpathです。@post.picture.url で帰ってくるものは URL で別物です。
「exifrはローカルファイルのexif情報しか取得できないのでしょうか?」はほぼそうです。
file is a filename or an IO object.
とあるので、fileそのもので有る必要はありませんが。
ですので S3からlocalに一時的に落とすか、
OpenUrlを使うか
EXIFR::JPEG.new(open(@post.picture.url)) 
でいけるかなぁ。。。

これでいけたら if Rails.env == 'production' の場合分け不要になりますね

投稿2020/01/17 21:50

winterboum

総合スコア23329

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問