2012-02-03 22 views
5

Tôi đang cố gắng phát triển các tệp tải lên trực tiếp lên S3 cho ứng dụng của mình. Tôi đang làm theo hướng dẫn github cho điều này và tất cả mọi thứ là nhiều hơn hoặc ít ok nhưng nhận được một thông báo lỗi khi cố gắng để làm cho chế biến bài viết.save_and_process post processing 403 Forbidden Carrierwave_direct S3 Fog

tôi đã làm như sau:

Tôi có một mô hình activerecord gọi 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 

Sau đó, tôi có một người tải lên: 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 

và một bộ điều khiển avatar :

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

và cuối cùng clip_controller tôi:

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 

Khi tôi tải lên một tập tin, nếu tôi chỉ cần lưu của tôi "clip", mọi thứ đều ok. Nếu tôi sử dụng phương pháp save_and_process Tuy nhiên, một lỗi phát sinh tại dòng: self.remote_avatar_url = avatar.direct_fog_url (: with_path => true)

Đây là thông báo lỗi:

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) 

Tôi đã treo trên này trong hai ngày như vậy, bất kỳ trợ giúp sẽ được đánh giá rất nhiều !!! Cảm ơn!!! Nicolas.

+0

Bạn đang nhận được gì từ kết quả của dòng này? 'self.remote_avatar_url = avatar.direct_fog_url (: with_path => true)' – pschuegr

+0

Tôi đã ngừng làm việc với Carrierwave trong một thời gian dài (quay lại Paperclip). Vì vậy, tôi không thể trả lời câu hỏi của bạn. Lấy làm tiếc... – ndemoreau

Trả lời

2

Đặt cược của tôi là URL được cung cấp cho self.remote_avatar_url không chính xác. Tôi đã có cùng một vấn đề này và mã mà CWDirect gem cung cấp không làm việc cho tôi và cho tôi một URL không chính xác, do đó CarrierWave không thể tải xuống và xử lý hình ảnh. Toàn bộ thông báo lỗi 403 Forbidden là một thông điệp crap từ Amazon - điều này dẫn người ta tin rằng có điều gì đó sai trái với Quyền; trong trường hợp của tôi hoàn toàn không có gì sai với các điều khoản. Chỉ là không có hình ảnh ở đó. Dưới đây là đoạn code mà đã làm việc này đối với tôi, nhận ra rằng tôi đã thay đổi cách URL được hình thành:

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 

Lưu ý rằng tên của lĩnh vực gắn kết của tôi là image và không avatar.

Làm thế nào tôi đã đến điểm này và sửa nó - hãy thử điều này, sử dụng trình gỡ lỗi đường ray (chỉ cần bỏ ghi chú dòng gỡ lỗi ở trên) để đóng băng chương trình ngay trước dòng self.remote_image_url, sau đó trong chế độ gỡ lỗi loại irb để bắt đầu lên bảng điều khiển. Sau đó, bạn có thể in ra và xem giá trị thực sự 'image.direct_fog_url (: with_path => true)' là gì cho bạn. Bạn có thể sao chép và dán vào trình duyệt. Nếu nó sai (có thể là) thì bạn sẽ nhận được lỗi Permissions ngớ ngẩn (mặc dù nó không phải là một vấn đề quyền), nhưng khi nó đúng, bạn sẽ thấy hình ảnh được tải lên hoặc hình ảnh sẽ tải xuống.

Bạn nên mở bảng điều khiển Amazon S3 của mình và xem nhóm dev của mình để có thể tìm thấy hình ảnh vừa tải lên. Tìm hình ảnh trong bảng điều khiển và chuyển đến các thuộc tính của nó và bạn có thể xem địa chỉ web/url mà bạn đang giả định là để sử dụng.

Hy vọng điều này sẽ hữu ích. Bởi vì lỗi gây hiểu lầm này rất khó để theo dõi cho tôi, tôi đã dành một loạt thời gian để sửa các quyền trên thùng S3 của tôi nhưng điều này không phải là vấn đề, chỉ cần mã từ trang GWD của CWDirect không hoạt động đối với tôi (phiên bản đá quý ??).

Các vấn đề liên quan