2012-03-18 56 views
3

我剛剛從通過Carrierwave本地上傳的圖片切換到使用Amazon s3通過我的Rails 3.1應用程序中的霧寶石進行切換。在添加圖像時,當我在應用程序中單擊圖像時,該URL會提供我的訪問密鑰和簽名。下面是一個簡單的網址(XXX替換成信息字符串):在Carrierwave和Fog的URL中顯示亞馬遜訪問密鑰

https://s3.amazonaws.com/bucketname/uploads/photo/image/2/IMG_4842.jpg?AWSAccessKeyId=XXX&Signature=XXX%3D&Expires=1332093418 

這是在發展發生(本地主機:3000),當我使用Heroku上進行生產。這是我上傳:

class ImageUploader < CarrierWave::Uploader::Base 
include CarrierWave::RMagick 
storage :fog 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 
    process :convert => :jpg 
    process :resize_to_limit => [640, 640] 
    version :thumb do 
    process :convert => :jpg 
    process :resize_to_fill => [280, 205] 
    end 
    version :avatar do 
    process :convert => :jpg 
    process :resize_to_fill => [120, 120] 
    end 
end 

而且我的配置/初始化/ fog.rb:

CarrierWave.configure do |config| 
    config.fog_credentials = { 
    :provider    => 'AWS', 
    :aws_access_key_id  => 'XXX', 
    :aws_secret_access_key => 'XXX', 
    } 
    config.fog_directory = 'bucketname' 
    config.fog_public  = false 
end 

任何人都知道如何確保這些信息是不可用?

UPDATE:添加視圖和控制器的代碼:從局部在用戶 /show.html.erb:

<% if @user.photos.any? %> 
    <% for photo in @user.photos %> 
    <li class="span4 hidey"> 
    <div class="thumb_box"> 
     <%=link_to(image_tag(photo.image_url(:thumb).to_s), photo.image_url.to_s, 
                 :class=>"lb_test") %> 
     ... 
    </div>  
    </li> 
    <% end %> 
<% end %> 

users_controller.rb:

def show 
    @user = User.find(params[:id]) 
end 

UPDATE:添加一個錯誤頁面我從網址中刪除訪問密鑰信息時獲取:

This XML file does not appear to have any style information associated with it. The document tree is shown below. 

<Error> 
<Code>AccessDenied</Code> 
    <Message>Access Denied</Message> 
    <RequestId>47077D6EC13AD1D8</RequestId> 
    <HostId>+HTeODcWTqv3gbRIAwf+lI6sPzfNTegDXjT9SnMdqrYr7gLD1TD0qN+OgMLwA1JO 
    </HostId> 
</Error> 
+0

凱文,我猜問題是在您的視圖或控制器。除非你需要另一個轉換版本。你能發佈代碼嗎? – 2012-03-29 11:17:52

+0

嗨,Ed,我添加了來自其中一個視圖和控制器操作的代碼。謝謝。 – kcurtin 2012-03-29 14:57:17

+0

如果您在控制檯中評估photo.image.url.to_s會發生什麼情況?它是否指向一個真實的圖像? – 2012-03-29 16:21:20

回答

4

你看到的是一個簽名的url。如果沒有完整的網址(包括密鑰,簽名,到期),您將獲得拒絕訪問權限。它正在按照應有的方式工作。我猜測關鍵只是一個公鑰,沒有你的私鑰(AWS有這個)是沒用的。

+0

啊我明白了。您無法在上傳器中將訪問密鑰設置爲我的「aws_access_key」。它將被包含在URL中似乎很奇怪。所以這些信息都不會讓別人訪問我的存儲桶? – kcurtin 2012-03-29 20:50:02

+0

沒有。簽名同時包含到期時間和您的公鑰,這些公鑰無法在沒有祕密密鑰的情況下生成(或者按照AWS的要求進行檢查)。它非常整齊。 – 2012-03-30 04:47:41

-1

試試photo.image.url而不是photo.image_url。這就是我正在使用的。

+0

photo.image.url和photo.image_url都是相同的網址:https://s3.amazonaws.com/bucketname/uploads/photo/image/2/IMG_4842.jpg?AWSAccessKeyId=XXX&Signature=XXX%3D&Expires=1332093418。如果我嘗試刪除訪問密鑰信息,並只使用https://s3.amazonaws.com/bucketname/uploads/photo/image/2/IMG_4842.jpg我得到的錯誤頁面我添加到我的原始帖子上面 – kcurtin 2012-03-29 18:10:32

+0

它可以成爲亞馬遜S3的設置嗎?它看起來像在發佈GET請求時需要URL中的訪問密鑰信息,而不是從用戶隱藏它..或類似的東西 – kcurtin 2012-03-29 18:15:23

6

刪除

config.fog_public  = false 

這是一個非默認值:)