1

この質問と同様の問題ですが、提供された解決策では問題が解決しませんでした。Carrierwave で処理された画像が S3 にアップロードされない

Railscast #383 をコードの基礎として使用: http://railscasts.com/episodes/383-uploading-to-amazon-s3

画像は、carrierwave_direct を使用して 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
4

1 に答える 1

0

アップローダ フォルダに元のアップローダをコピーし、「image_uploader_file.rb」という名前に変更しました。次に、元のバージョンの「image_uploader.rb」を変更して、fog と S3 を使用しました。Carrierwave は「image_uploader.rb」のみを使用すると想定していましたが、両方のファイルをロードしたようです。古いバージョンはローカル ストレージを使用していたため、carrierwave が画像を保存した場所でした。「image_uploader_file.rb」を削除すると、処理された画像が S3 に正しくアップロードされました。

于 2013-03-20T15:37:21.533 に答える