2012-02-03 27 views
5

Estoy tratando de desarrollar cargas de archivos directas a S3 para mi aplicación. Estoy siguiendo el tutorial de github para esto y todo está más o menos bien, pero aparece un mensaje de error cuando intento hacer el postprocesamiento.save_and_process post procesamiento 403 Prohibido Carrierwave_direct S3 Fog

hice lo siguiente:

tengo un modelo activerecord llamada 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 

Entonces tengo una subida 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 

y un controlador de avatar :

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

y finalmente mi 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 

Al cargar un archivo, si acabo de salvar a mi "pinza", todo está bien. Si utilizo el método save_and_process sin embargo, surge un error en la línea: self.remote_avatar_url = avatar.direct_fog_url (: with_path => true)

Este es el mensaje de error:

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) 

he estado aguantando esto durante dos días, ¡cualquier ayuda sería muy apreciada! ¡¡¡Gracias!!! Nicolas.

+0

¿Qué obtiene como resultado de esta línea? 'self.remote_avatar_url = avatar.direct_fog_url (: with_path => true)' – pschuegr

+0

He dejado de trabajar con Carrierwave durante mucho tiempo (de nuevo a Paperclip). Entonces no puedo responder tu pregunta. Lo siento... – ndemoreau

Respuesta

2

Mi apuesta es que la URL suministrada a self.remote_avatar_url es incorrecta. Tuve el mismo problema y el código que proporciona CWDirect gem no me funcionaba y me proporcionó una URL incorrecta, por lo que CarrierWave no pudo descargar y procesar la imagen. El mensaje de error completo de 403 Forbidden fue un mensaje de mierda de Amazon: esto lleva a creer que hay algún problema con los Permisos; en mi caso no había absolutamente nada de malo con los permisos. Era solo que no había ninguna imagen allí. Aquí está el código que tiene este trabajo para mí, se dio cuenta que he cambiado cómo se forma la 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 

Tenga en cuenta que el nombre de mi campo es montada image y no avatar.

¿Cómo llegué a este punto y lo arreglaron - probar esto, utilizar el depurador de carriles (simplemente elimine la línea depurador arriba) para congelar el programa justo antes de la línea self.remote_image_url, a continuación, mientras que en el modo de depuración de tipo irb para empezar arriba de la consola Luego puede imprimir y ver realmente qué valor le está dando 'image.direct_fog_url (: with_path => true)'. Puede copiar y pegar esto en un navegador. Si está mal (probablemente lo sea), obtendrá el error de Permiso tonto (aunque no es un problema de permisos), pero cuando sea correcto, verá la imagen cargada o se descargará la imagen.

Es una buena idea tener abierta la consola de Amazon S3 y ver su cubo de desarrollo para que pueda encontrar la imagen que acaba de subir. Busque la imagen en la consola y vaya a sus propiedades y puede ver la dirección web/url que está suponiendo que está usando.

Espero que esto ayude. Debido al error engañoso que me costó rastrear, pasé un montón de tiempo intentando corregir los permisos en mi bucket S3 pero este no era el problema, solo que el código de la página CWDirect github no funciona para mí (versión de gema ??).

Cuestiones relacionadas