我一直在試圖讓Paperclip上傳圖像到Amazon S3。儘管我首先得到了程序,但它只能在本地保存(儘管存儲方法設置爲s3),並且一旦我發現我需要重寫默認路徑,它會因寫入錯誤而崩潰。將回形針上傳到S3開發和生產
我不知道它是否重要,但我使用Devise並將profile_image
添加到用戶模型中。
我試圖按照this guide從Heroku的
這裏是只有儘管似乎成爲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時都是如此)。
接着,我試圖通過添加這迫使顯示URL來形式AWS到
配置/初始化/ paperclip.rb
Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'
和這確實迫使圖像路徑來從那裏(當我刷新已經附加圖像的用戶的頁面時,由於沒有上傳圖像,所以它被破壞了)。不過,在我刪除這張圖片後,我無法再上傳。每次我試圖上傳我得到這個錯誤:
Errno::EACCES in Devise::RegistrationsController#update
Permission denied @ dir_s_mkdir - /users/profile_images
在試圖解決這個問題,我添加(從Heroku的教程)
Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-east-1.amazonaws.com'
額外的初始化,沒有工作,我嘗試加入一行到production.rb和development.rb沒有成功(我嘗試添加既默認哈希和證書哈希)
s3_domain_url: 's3-us-east-1.amazonaws.com'
我明白,錯誤是本地寫錯誤,但我的SP (除了我如何做這項工作):
爲什麼回形針忽略存儲值的默認值並保存在本地(在第一種情況下)? 爲什麼它試圖寫入我的本地磁盤(在第二種情況下),而不是上傳到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]
這確實解決了寫錯誤,但你可以發佈您的Gemfile圖片尚未在本地,而不是上傳到S3 – oneWorkingHeadphone
救嗎? – Jeremie
在底部添加 – oneWorkingHeadphone