12

Carrierwaveとフォグジェムを使用してRubyonRailsのS3に画像をアップロードしようとすると、画像は正しくアップロードされますが、アップロードしたばかりの画像に関する情報を含むモデルを保存しようとすると、このエラーが発生します。

Excon::Errors::MovedPermanently in UserController#show
app/models/user.rb:46:in `process_image_with_key'
app/controllers/user_controller.rb:12:in `show'

<Excon::Response:0x007f97846a3c18 @body="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>PermanentRedirect</Code><Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>

ユーザーモデル:

mount_uploader :image, AvatarUploader

def image_name
  File.basename(image.path || image.filename) if image
end

def process_image_with_key( key )
  unless key.nil?
    self.key = key
    self.remote_image_url = self.image.direct_fog_url(with_path: true)
    self.save!
  end
end

AvatarUploader:

# encoding: utf-8

class AvatarUploader < CarrierWave::Uploader::Base

  include CarrierWaveDirect::Uploader

  include CarrierWave::RMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

  include CarrierWave::MimeTypes
  process :set_content_type

  version :thumb do
    process resize_to_fill: [50, 50]
  end

end

ユーザーコントローラー

def show
  @user = User.find_by_id(params[:id])
  @user.process_image_with_key(params[:key])
  @uploader = User.new.image
  @uploader.success_action_redirect = user_url(@user.id)
end

carriwerwave初期化子

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => ENV['AWS_ACCESS_KEY_ID'],
    :aws_secret_access_key  => ENV['AWS_SECRET_ACCESS_KEY'],
    :region                 => 'us-west-1'
  }
  config.fog_directory  = ENV['AWS_FILE_BUCKET']
  config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}
end

gemfile

gem 'carrierwave'
gem 'rmagick'
gem 'fog'
gem 'carrierwave_direct'
4

2 に答える 2

29
<Error><Code>PermanentRedirect</Code><Message>The bucket you are attempting to access
must be addressed using the specified endpoint. Please send all future requests to 
this endpoint.</Message></Error>

これは頻繁に発生する問題です。リージョンus-west-1のバケットにアクセスしようとしていますが、レガシーの理由により、ほとんど/すべてのAWSSDKのデフォルトのAmazonS3リージョンはUSStandardであり、これはリクエストを北部の施設に自動的にルーティングしますネットワークマップを使用したバージニアまたは太平洋岸北西部(詳細については、リージョンとエンドポイントを参照してください)。

したがって、S3 APIを使用する前に、バケットリージョンのエンドポイントを明示的に指定する必要があります(例:us-west-1:)

  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => ENV['AWS_ACCESS_KEY_ID'],
    :aws_secret_access_key  => ENV['AWS_SECRET_ACCESS_KEY'],
    :region                 => 'us-west-1'
    :endpoint               => 'https://s3-us-west-1.amazonaws.com/'
  }
于 2012-12-04T13:02:21.933 に答える
1

Steffen Opelに改めて感謝します!

しかし、私が行っていないいくつかの考慮事項、私の地域は米国標準であるため、私のcarrierwave初期化子は次のようになります:#:region =>#米国標準では必要ありません:endpoint =>' https://s3.amazonaws.com '

このリンクが鍵でした:D

于 2012-12-04T21:13:17.203 に答える