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

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

ただいまの
回答率

90.01%

carrierwaveとS3とherokuを使って本番環境に画像と動画をアップロードしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 46

画像と動画を投稿する機能を入れたいのですが、開発環境ではうまく投稿できたものの、本番環境で投稿する事が出来ずにエラーが出てしまいます。
S3はしっかり登録できていると思います。
![イメージ説明

heroku logs

2019-11-08T05:31:14.847339+00:00 app[web.1]: F, [2019-11-08T05:31:14.847266 #7] FATAL -- : [b25f058c-d42d-49b9-8fc3-16721852aa87] app/controllers/users_controller.rb:87:in `update'
2019-11-08T05:45:37.479864+00:00 app[web.1]: I, [2019-11-08T05:45:37.479722 #7]  INFO -- : [5aac0677-48da-494d-a8c7-39470cd77411] Started PATCH "/users/1" for 49.97.93.117 at 2019-11-08 05:45:37 +0000
2019-11-08T05:45:37.481538+00:00 app[web.1]: I, [2019-11-08T05:45:37.481460 #7]  INFO -- : [5aac0677-48da-494d-a8c7-39470cd77411] Processing by UsersController#update as HTML
2019-11-08T05:45:37.481672+00:00 app[web.1]: I, [2019-11-08T05:45:37.481586 #7]  INFO -- : [5aac0677-48da-494d-a8c7-39470cd77411]   Parameters: {"utf8"=>"✓", "authenticity_token"=>"hsjRigkI4ygHdNqncpax0N/IPv8YcTpNiI7QheJLJ7a9kAxZFjLrgxAD6w4xXc5x3ndGM0sqrkf2Hr02s5NrpQ==", "user"=>{"name"=>"abcdefg", "password"=>"[FILTERED]", "image_name"=>#<ActionDispatch::Http::UploadedFile:0x000055a7c2fffe28 @tempfile=#<Tempfile:/tmp/RackMultipart20191108-7-qtcbrf.jpg>, @original_filename="TOMS526506_TP_V.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"user[image_name]\"; filename=\"TOMS526506_TP_V.jpg\"\r\nContent-Type: image/jpeg\r\n">}, "commit"=>"変更する", "id"=>"1"}
2019-11-08T05:45:37.484693+00:00 app[web.1]: D, [2019-11-08T05:45:37.484603 #7] DEBUG -- : [5aac0677-48da-494d-a8c7-39470cd77411]   User Load (0.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
2019-11-08T05:45:37.487003+00:00 app[web.1]: D, [2019-11-08T05:45:37.486934 #7] DEBUG -- : [5aac0677-48da-494d-a8c7-39470cd77411]   User Load (0.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
2019-11-08T05:45:37.487596+00:00 app[web.1]: D, [2019-11-08T05:45:37.487523 #7] DEBUG -- : [5aac0677-48da-494d-a8c7-39470cd77411]   CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
2019-11-08T05:45:37.488930+00:00 app[web.1]: D, [2019-11-08T05:45:37.488863 #7] DEBUG -- : [5aac0677-48da-494d-a8c7-39470cd77411]    (0.8ms)  BEGIN
2019-11-08T05:45:37.494926+00:00 app[web.1]: D, [2019-11-08T05:45:37.494851 #7] DEBUG -- : [5aac0677-48da-494d-a8c7-39470cd77411]   User Exists (0.9ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER($1) AND ("users"."id" != $2) LIMIT $3  [["email", "abcdefg@gmail.com"], ["id", 1], ["LIMIT", 1]]
2019-11-08T05:45:37.576046+00:00 app[web.1]: D, [2019-11-08T05:45:37.575906 #7] DEBUG -- : [5aac0677-48da-494d-a8c7-39470cd77411]   SQL (1.6ms)  UPDATE "users" SET "image_name" = $1, "activation_digest" = $2, "updated_at" = $3 WHERE "users"."id" = $4  [["image_name", "TOMS526506_TP_V.jpg"], ["activation_digest", "$2a$10$gxvP23sAHTfTSm1XkAsktOzVhG9WTuyB7BTZSPieFHJFQ31earhwi"], ["updated_at", "2019-11-08 05:45:37.572718"], ["id", 1]]
2019-11-08T05:45:38.086514+00:00 app[web.1]: D, [2019-11-08T05:45:38.086383 #7] DEBUG -- : [5aac0677-48da-494d-a8c7-39470cd77411]    (0.7ms)  ROLLBACK
2019-11-08T05:45:38.086911+00:00 app[web.1]: I, [2019-11-08T05:45:38.086816 #7]  INFO -- : [5aac0677-48da-494d-a8c7-39470cd77411] Completed 500 Internal Server Error in 605ms (ActiveRecord: 5.5ms)
2019-11-08T05:45:38.090681+00:00 app[web.1]: F, [2019-11-08T05:45:38.089230 #7] FATAL -- : [5aac0677-48da-494d-a8c7-39470cd77411]
2019-11-08T05:45:38.090808+00:00 app[web.1]: F, [2019-11-08T05:45:38.090689 #7] FATAL -- : [5aac0677-48da-494d-a8c7-39470cd77411] Excon::Error::InvalidHeaderValue ("AWS4-HMAC-SHA256 Credential=\n#{ここにアクセスキーが入っていました}\n/20191108/ap-northeast-1/s3/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-acl;x-amz-content-sha256;x-amz-date, Signature=19c328c51846e4cd3728a349efb2d2874043c036d30495e08a04a8caec1ce82d" contains forbidden "\r" or "\n"):
2019-11-08T05:45:38.090869+00:00 app[web.1]: F, [2019-11-08T05:45:38.090794 #7] FATAL -- : [5aac0677-48da-494d-a8c7-39470cd77411]
2019-11-08T05:45:38.090963+00:00 app[web.1]: F, [2019-11-08T05:45:38.090884 #7] FATAL -- : [5aac0677-48da-494d-a8c7-39470cd77411] app/controllers/users_controller.rb:87:in `update'
source 'https://rubygems.org'
ruby "2.6.3"
gem 'rails',        '5.1.6'
gem 'puma',         '3.9.1'
gem 'faker',          '1.7.3'
gem 'bootstrap-sass', '3.3.7'
gem 'sass-rails',   '5.0.6'
# ページネーション
gem 'will_paginate'
# パスワードセキュリティー
gem 'bcrypt', '~> 3.1.7'
#validates 日本語化
gem 'rails-i18n'

#動画配信サービス
gem 'carrierwave',             '1.2.2'
gem 'fog'


#グーグルアナリティクス
gem 'google-analytics-rails'

gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'

gem 'font-awesome-sass'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.7.0'


group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
  gem 'rails-controller-testing'
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

group :production do
  gem 'pg', '0.20.0'

end

# Windows環境ではtzinfo-dataというgemを含める必要があります
# gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]


carrier_wave.rb

CarrierWave.configure do |config|
  if Rails.env.production?
          config.storage = :fog # キャッシュにS3を指定
      config.fog_credentials = {
          :provider              => 'AWS',
          :aws_access_key_id     => ENV['S3_ACCESS_KEY'],
          :aws_secret_access_key => ENV['S3_SECRET_KEY'],
          :region                => ENV['S3_REGION'],
      }

      config.fog_directory = ENV['S3_BUCKET']
      config.asset_host = "https://s3.amazonaws.com/#{ENV['S3_BUCKET']}"


  else
      config.storage = :file
      config.fog_directory  = ENV['S3_BUCKET']
      config.asset_host = "https://s3.amazonaws.com/#{ENV['S3_BUCKET']}"
  end
end


video_uploader.rb

class VideoUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  # include CarrierWave::FFMPEG
  # Choose what kind of storage to use for this uploader:
  #storage :file
  if Rails.env.production?
    storage :fog
  else
    storage :file
  end

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url(*args)
  #   # For Rails 3.1+ asset pipeline compatibility:
  #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  #
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end

  # Process files as they are uploaded:
  # process scale: [200, 300]
  #
  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:
  # Create different versions of your uploaded files:
  # version :ss do
  # process :screenshot
  # def full_filename(for_file = model.logo.file)
  #   "screenshot.jpg"
  # end
  # end
  # version :thumb do
  #   process resize_to_fit: [50, 50]
  # end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
   def extension_whitelist
    %w(jpg jpeg png wmv mov mp4 flv gif avi)
   end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  # def filename
  #   "something.jpg" if original_filename
  # end
end


picture_uploader.rb

class PictureUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  # include CarrierWave::MiniMagick
  def default_url
    "default.png"
  end
  # Choose what kind of storage to use for this uploader:

  if Rails.env.production?
    storage :fog
  else
    storage :file
  end
  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url(*args)
  #   # For Rails 3.1+ asset pipeline compatibility:
  #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  #
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end

  # Process files as they are uploaded:
  # process scale: [200, 300]
  #
  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:
  # version :thumb do
  #   process resize_to_fit: [40, 40]
  # end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:

  # # リサイズしたり画像形式を変更するのに必要
  # include CarrierWave::RMagick



  # # 保存形式をJPGにする
  # process :convert => 'jpg'



 # アップロード可能な拡張子のリスト
  def extension_whitelist
    %w(jpg jpeg gif png psd)
  end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  # def filename
  #   "something.jpg" if original_filename
  # end
end


解決策を教えてください!

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

環境変数が正しく入れられてなかったみたいで(謎の空白があった)入れ直したら無事投稿できました!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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