2012-02-03 4 views
5

Я пытаюсь разработать прямые файлы для S3 для своего приложения. Я слежу за учебником github для этого, и все более или менее нормально, но при попытке выполнить пост-обработку вы получите сообщение об ошибке.save_and_process post processing 403 Forbidden Carrierwave_direct S3 Fog

я сделал следующее:

У меня есть модель ActiveRecord под названием clip.rb:

class Clip < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 
    mount_uploader :avatar, AvatarUploader 

    attr_accessible :id, :avatar, :name, :clipat_file_name, :attachable_id, :attachable_type, :clipat, :project_id, :user_id, :path, :parent_id, 

    def save_and_process_avatar(options = {}) 
    if options[:now] or 1==1 
     self.remote_avatar_url = avatar.direct_fog_url(:with_path => true) 
     save 
    else 
     Resque.enqueue(AvatarProcessor, attributes) 
    end 
    end 

Тогда у меня есть загрузчик: avatar_uploader.rb

class AvatarUploader < CarrierWave::Uploader::Base 
    include CarrierWave::RMagick 
    include CarrierWaveDirect::Uploader 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}" #I removed /#{model.id} from the template because it creates an empty directory on the server. But If I put it back, the same problem remains 
    end 
    version :thumb do 
    process :resize_to_limit => [50, 50] 
    end 
end 

и контроллер аватара :

class AvatarsController < ApplicationController 
    def new 
    @uploader = Clip.new.avatar 
    @uploader.success_action_redirect = 'http://localhost:3000/clips' 
    end 
end 

и, наконец, моя clip_controller:

class ClipsController < ApplicationController 
    def index 
    if params[:key] 
     key=params[:key].split("/") 
     clip = Clip.new 
     clip.attachable_id = key[3] 
     clip.attachable_type = "Pmdocument" 
     clip.key = params[:key] 
#  clip.save 
     clip.save_and_process_avatar 
    end 
    @clips = Clip.where("avatar is not null") 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @clips.collect { |p| p.to_jq_upload }.to_json } 
    end 
    end 

Когда я загрузить файл, если я просто сохранить свой «клип», все в порядке. Если я использую save_and_process метода, однако, возникает ошибка в строке: self.remote_avatar_url = avatar.direct_fog_url (: with_path => правды)

Это сообщение об ошибке:

OpenURI::HTTPError (403 Forbidden): 
    app/models/clip.rb:38:in `save_and_process_avatar' 
    app/controllers/clips_controller.rb:22:in `index' 

Rendered /Users/nico/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.4ms) 
Rendered /Users/nico/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.2ms) 
Rendered /Users/nico/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (5.2ms) 

Я был вися на этом в течение двух дней, поэтому любая помощь будет принята с благодарностью! Благодаря!!! Николя.

+0

Что вы получаете в результате этой линии? 'self.remote_avatar_url = avatar.direct_fog_url (: with_path => true)' – pschuegr

+0

Я уже давно перестал работать с Carrierwave (назад к Paperclip). Поэтому я не могу ответить на ваш вопрос. Сожалею... – ndemoreau

ответ

2

Я считаю, что неверный URL-адрес, указанный в . У меня была такая же проблема, и код, который предоставил CWDirect gem, не работал для меня и дал мне неправильный URL, поэтому CarrierWave не смог загрузить и обработать изображение. Все сообщение об ошибке 403 Forbidden было хриплым сообщением от Amazon - это заставляет думать, что что-то не так с Разрешениями; в моем случае не было абсолютно ничего плохого в разрешениях. Просто там не было изображения. Вот код, который получил эту работу для меня, заметьте, я изменился, как формируется URL:

def save_and_process_image(options = {}) 
if options[:now] 
    # debugger 
    self.remote_image_url = image.direct_fog_url+self.key # OLD CODE THAT AINT WORKIN! --> image.direct_fog_url(:with_path => true) 
    save 
else 
    # Resque.enqueue(AvatarProcessor, attributes) 
    # TODO: Implement background processing 
end 
end 

Обратите внимание, что имя моего смонтированного поля image и не avatar.

Как я попал в этот момент и фиксируется - попробуйте это, использовать рельсы отладчик (просто раскомментировать отладчик строку выше), чтобы заморозить программу непосредственно перед self.remote_image_url линии, то в то время как в режиме отладки типа irb начать до консоли. Затем вы можете распечатать и увидеть действительно какое значение «image.direct_fog_url (: with_path => true)» дает вам. Вы можете скопировать и вставить его в браузер. Если это неправильно (возможно, это так), вы получите глупую ошибку разрешений (даже если это не проблема с разрешениями), но когда она верна, вы увидите загруженное изображение или изображение загрузится.

Это хорошая идея открыть вашу консоль Amazon S3 и просмотреть ваш Dev-ковш, чтобы вы могли найти только что загруженное изображение. Найдите изображение в консоли и перейдите к ее свойствам, и вы увидите веб-адрес/URL-адрес, который вы являетесь Предпочитаемый.

Надеюсь, что это поможет. Из-за ошибочной ошибки это было трудно отследить для меня, я потратил кучу времени, пытаясь исправить разрешения на моем ведомости S3, но это не проблема, только этот код с страницы CWDirect github не работает для меня (версия gem?).