Аналогичная проблема с этим вопросом, но предоставленное решение не решило мою проблему. Обработанные изображения Carrierwave не загружаются на S3
Использование Railscast #383 в качестве основы для кода: http://railscasts.com/episodes/383-uploading-to-amazon-s3
Изображение успешно загружено на S3 с использованием несущей волны_директ. Я хочу обработать изображения в фоновом режиме с помощью sidekiq, а затем загрузить на S3.
Рабочий процесс sidekiq завершает обработку изображения без ошибок, но обработанные изображения (:thumb и :large) хранятся локально в папке public/uploads.
Есть идеи, почему обработанные изображения не загружаются на S3?
Загрузчик:
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :fog
include CarrierWave::MimeTypes
process :set_content_type
include Sprockets::Helpers::RailsHelper
include Sprockets::Helpers::IsolatedHelper
version :thumb do
process :resize_to_limit => [200, 200]
end
version :large do
process :resize_to_limit => [600, 400]
end
def extension_white_list
%w(jpg jpeg gif png)
end
end
Модель:
class Photo < ActiveRecord::Base
attr_accessible :name, :image, :remote_image_url, :user_id
mount_uploader :image, ImageUploader
belongs_to :user
after_commit :enqueue_image, :on => :create
has_many :comments, as: :commentable
def image_name
File.basename(image.path || image.filename) if image
end
def enqueue_image
ImageWorker.perform_async(id, key) if key.present?
end
class ImageWorker
include Sidekiq::Worker
sidekiq_options retry: false
def perform(id, key)
photo = Photo.find(id)
photo.key = key
photo.remote_image_url = photo.image.direct_fog_url(with_path: true)
photo.save!
end
end
end
ФотоКонтроллер
class PhotosController < ApplicationController
def index
@photos = Photo.all
@uploader = Photo.new.image
@uploader.success_action_redirect = new_photo_url
end
Вид
.
.
.
<%= direct_upload_form_for @uploader do |f| %>
<p><%= f.file_field :image %></p>
<p><%= f.submit "Upload Photo" %></p>
<% end %>
инициализаторы/carrierwave.rb
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"]
}
config.fog_directory = ENV["AWS_S3_BUCKET"]
end
initializers/fog.rb *добавлено на основе ответа на вопрос, указанный выше
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-east-1'
}
config.fog_directory = ENV["AWS_S3_BUCKET"]
config.fog_public = true
config.fog_attributes = {'Cache-Control' => 'max-age=315576000'}
end