2017-03-24 2 views
0

私は、Amazon S3に画像をアップロードするためにPaperclipを取得しようとしていました。プログラムは最初は動作していましたが、(s3に設定された記憶方法にもかかわらず)ローカルにしか保存されず、デフォルトのパスをオーバーライドする必要があるとわかったら、書き込みエラーでクラッシュします。開発と生産でS3にアップロードするPaperclipを取得する

重要かどうかわかりませんが、私はDeviseを使用しており、profile_imageをユーザーモデルに追加しました。

私はここでHerokuの

からthis guideに従うことをしようとしているだけでS3のためにセットアップするために見せかけにもかかわらず、ローカルに書く最初のセットアップです:

user.rb 
    class User < ApplicationRecord 
     has_attached_file :profile_image, styles: { 
     thumb: '100x100>', 
     square: '200x200#', 
     medium: '300x300>' 
     } 
     validates_attachment_content_type :profile_image, :content_type => /\Aimage\/.*\Z/ 
end 

production.rbとdevelopment.rb

config.paperlip_defaults = { 
    storage: :s3, 
    s3_credientials: { 
     bucket: ENV.fetch('S3_BUCKET_NAME'), 
     access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'), 
     secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'), 
     s3_region: ENV.fetch('AWS_REGION') 
    } 
    } 
    Paperclip.options[:command_path] = '/usr/local/bin/' 

アップロードフォームの部分 app/views/devise/registrations/edit.html.erb

<div class="form-group"> 
     <% if @user.profile_image.present? %> 
     <%= image_tag(current_user.profile_image.url(:square)) %><br /> 
     <%= link_to 'Remove profile image', remove_profile_image_path, method: :put, data: { confirm: 'Are you sure?' }, type: 'button' %> 
     <% else %> 
     <%= f.label :profile_image %> 
     <%= f.file_field :profile_image %> 
     <% end %> 
    </div> 

この設定では、Paperclipは機能しますが、イメージをローカルに保存するだけです(これは開発中とHerokuの両方に適用されます)。

次に、Iは

設定/イニシャライザ/ paperclip.rb

Paperclip::Attachment.default_options[:url] = ':s3_domain_url' 
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename' 

にこれを追加することによって、フォームAWSを来て、表示URLを強制しようとし、これはそこから来て画像パスを強制し(画像が既に添付されているユーザーのページを更新したとき、アップロードされた画像がなかったために壊れていました)。ただし、この画像を削除した後、もうアップロードできませんでした。私がしようとするたびに、私はこのエラーを取得アップロードする:私は動作しませんでした

Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-east-1.amazonaws.com' 

(Herokuのチュートリアルから)追加の初期化子を追加しました。この問題を解決しようとする試みで

Errno::EACCES in Devise::RegistrationsController#update 

Permission denied @ dir_s_mkdir - /users/profile_images 

をし、私が追加してみました成功なしproduction.rbとdevelopment.rbへ行(私はデフォルトのハッシュの両方を追加し、資格情報がハッシュしようとした)

s3_domain_url: 's3-us-east-1.amazonaws.com' 

私はエラーがローカル書き込みエラーであることを理解し、私のsp

Paperclipは、デフォルトではストレージ値を無視し、ローカルに保存する理由は何ですか(最初のシナリオでは) それはなぜ私のローカルディスクに書き込もうとしていて(2番目のシナリオで)、S3にアップロードしていないのですか?

更新 Gemfile

source 'https://rubygems.org' 

ruby '2.3.3' 

gem 'rails',     '~> 5.0.0', '>= 5.0.0.1' 
gem 'puma',     '~> 3.0' 
gem 'sass-rails',    '~> 5.0' 
gem 'uglifier',    '>= 1.3.0' 
gem 'coffee-rails',   '~> 4.2' 
gem 'jquery-rails' 
gem 'turbolinks',    '~> 5' 
gem 'jbuilder',    '~> 2.5' 
gem 'bcrypt',     '~> 3.1.7' 
gem 'devise' 
gem 'font-awesome-rails' 
gem 'bourbon',     '5.0.0.beta.7' 
gem 'neat',     '2.0.0' 
gem 'autoprefixer-rails' 
gem 'font-awesome-sass',  '~> 4.7.0' 
gem 'paperclip' 
gem 'aws-sdk',     '~> 2.3' 

group :development, :test do 
    gem 'sqlite3' 
    gem 'byebug', platform: :mri 
    gem 'dotenv-rails' 
end 

group :development do 
    gem 'listen', '~> 3.0.5' 
    gem 'web-console' 
    gem 'spring' 
    gem 'spring-watcher-listen', '~> 2.0.0' 
    gem 'rubocop', require: false 
    gem 'haml-lint', require: false 
end 

group :test do 
    gem 'guard', '2.13.0' 
    gem 'minitest-reporters', '1.1.9' 
    gem 'coveralls', require: false 
    gem 'capybara' 
    gem 'factory_girl_rails', '~>4.0' 
end 

group :production do 
    gem 'pg', '0.18.4' 
end 

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem 
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] 

答えて

1

からパスオプションを変更する必要があるかもしれませんHerokuのPaperclip ~> 5.1 & AWS-SDK ~> 2.0に有効です。

開発中に動作するようになったらすぐに明らかになる、問題のない第2の問題もあります。開発アップロードは本番アップロードを上書きし、逆も同様です。

これは、両方のS3にアップロードする開発環境と本番環境を使用して私の仕事をしてくれた設定です。唯一の共有情報

config/initializers/paperclip.rb

Paperclip::Attachment.default_options[:path] = ':class/:attachment/:id_partition/:style/:filename' 
Paperclip::Attachment.default_options[:storage] = :s3 
Paperclip::Attachment.default_options[:s3_protocol] = 'https' 
に初期化子ダウン

  1. スリム<オール "2" =スタート>
  2. ユーザーモデルで定義し、有効な画像と画像サイズ
  3. app/model/users.rb

    has_attached_file :profile_image, styles: { 
        thumb: '100x100>', 
        square: '200x200#', 
        medium: '300x300>' 
        } 
    validates_attachment_content_type :profile_image, :content_type => /\Aimage\/.*\Z/ 
    
  4. 第DEV画像バケットを登録し、
      .ENVファイルに

    .ENV

    # Shared S3 variables 
    AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXX 
    AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXX 
    
    # Development variables 
    DEV_S3_BUCKET_NAME=your-dev-bucket-name 
    
    # Production variables 
    S3_BUCKET_NAME=your-production-bucket-name 
    
    に必要な変数を追加">
  5. それぞれの環境ファイルにデフォルトオプションとコマンドパスを入れます。
config/environments/development.rb

Paperclip::Attachment.default_options[:s3_credentials] = { 
    :bucket => ENV['DEV_S3_BUCKET_NAME'], 
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'], 
    :region => 'us-east-2' 
    } 
Paperclip::Attachment.default_options[:s3_region] = 'us-east-2' 
Paperclip::Attachment.default_options[:s3_host_name] = 's3.us-east-2.amazonaws.com' 
Paperclip.options[:command_path] = 'usr/local/bin' 

は、私の場合、私はあなたがしたい場合は、これらを抽出することができ、地域やホスト名をハードコーディング。私はまたちょっと離れて別の地域にdevイメージをホストすることにしました。また、作成した最初のバケット(プロダクション)は、アドレスに地域を追加しません。なぜS3がこのように設定されているのかわかりませんが、画像URLを見つけるまで、画像をアップロードしてAWS Consoleのフォルダにドリルダウンして、特定の画像パスを確認できます。

config/environments/production.rb

Paperclip::Attachment.default_options[:s3_credentials] = { 
    :bucket => ENV['S3_BUCKET_NAME'], 
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'], 
    :region => 'us-east-1' 
    } 
Paperclip::Attachment.default_options[:s3_region] = 'us-east-1' 
Paperclip::Attachment.default_options[:s3_host_name] = 's3.amazonaws.com' 
Paperclip.options[:command_path] = 'usr/local/bin' 
0

あなたは、これが問題にセットアップされ、ドキュメントが使用されている方法が間違っているか、いないのどちらかである

PaperClip::Attachment.default_options[:path] = ":rails_root/public/system/.../the/rest/of/the/desired/path" 
+0

これは、書き込みエラーを解決しますが、画像はまだ、ローカルに保存され、あなたがあなたのGemfileを投稿できるS3 – oneWorkingHeadphone

+0

にアップロードされていませんか? – Jeremie

+0

下に追加 – oneWorkingHeadphone

関連する問題