2012-02-03 14 views
5

Sto cercando di sviluppare fileupload diretti su S3 per la mia app. Sto seguendo il tutorial di github per questo e tutto è più o meno ok ma ricevo un messaggio di errore quando provo a fare il post processing.save_and_process post processing 403 Forbidden Carrierwave_direct S3 Fog

ho fatto la seguente:

Ho un modello di ActiveRecord chiamato 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 

Poi ho un uploader: 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 

e un controller avatar :

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

e, infine, il mio 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 

Quando aggiungo un file, se mi limito a salvare il mio "clip", tutto è ok. Se uso il metodo save_and_process tuttavia, si verifica un errore alla riga: self.remote_avatar_url = avatar.direct_fog_url (: with_path => true)

Questo è il messaggio di errore:

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) 

Sono stato appeso su questo per due giorni quindi, qualsiasi aiuto sarebbe molto apprezzato !!! Grazie!!! Nicolas.

+0

Cosa ottieni come risultato di questa linea? 'self.remote_avatar_url = avatar.direct_fog_url (: with_path => true)' – pschuegr

+0

Ho smesso di funzionare con Carrierwave da molto tempo (torna a Paperclip). Quindi non posso rispondere alla tua domanda. Scusate... – ndemoreau

risposta

2

La mia scommessa è che l'URL fornito a self.remote_avatar_url non è corretto. Ho avuto questo stesso problema e il codice fornito da CWDirect non funzionava per me e mi dava un URL errato, quindi CarrierWave non poteva scaricare ed elaborare l'immagine. L'intero messaggio di errore Proibito 403 era un messaggio di merda proveniente da Amazon - questo porta a credere che ci sia qualcosa di sbagliato in Autorizzazioni; nel mio caso non c'era assolutamente nulla di sbagliato nelle autorizzazioni. Era solo che non c'era immagine lì. Ecco il codice che ha ottenuto questo lavoro per me, si noti che ho cambiato come si forma l'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 

Nota che il nome del mio campo montato è image e non avatar.

Come sono arrivato a questo punto e riparato - provare questo, utilizzare il debugger rotaie (basta togliere il commento alla linea di debugger sopra) di congelare il programma poco prima della linea di self.remote_image_url, quindi in modalità di debug tipo irb per iniziare su per la console. Quindi puoi stampare e vedere realmente quale valore 'image.direct_fog_url (: with_path => true)' ti sta dando. Puoi copiare e incollare questo in un browser. Se è sbagliato (probabilmente lo è), otterrai l'errore di Autorizzazioni stupido (anche se non si tratta di un problema di autorizzazioni), ma quando è corretto o vedrai l'immagine caricata o l'immagine verrà scaricata.

È una buona idea aprire la console di Amazon S3 e visualizzare il bucket di sviluppo in modo da poter trovare l'immagine appena caricata. Trova l'immagine nella console e vai alle sue proprietà e puoi vedere l'indirizzo web/url che stai usando supposto.

Spero che questo aiuti. A causa dell'errore fuorviante, è stato difficile rintracciarmi, ho impiegato un po 'di tempo a cercare di correggere i permessi sul mio bucket S3 ma questo non era il problema, solo che il codice dalla pagina github di CWDirect non funziona per me (versione gemma ??).

Problemi correlati