1

所以這似乎應該很容易...每個人都說只是使用config.asset_host。當我設置,雖然,我的應用程序內的所有鏈接仍然指向S3。Cloudfront + Carrierwave

CarrierWave.configure do |config| 

    config.storage = :fog 

    config.fog_credentials = { 
    :provider    => 'AWS', 
    :aws_access_key_id  => AWS_ACCESS_KEY_ID, 
    :aws_secret_access_key => AWS_SECRET_ACCESS_KEY, 
    :region    => 'us-east-1' 
    } 

    config.fog_authenticated_url_expiration = 3.hours 

    config.asset_host  = "http://xyz123.cloudfront.net" 
    config.fog_directory = S3_BUCKET_NAME 
    config.fog_public  = false 
    config.fog_attributes = { 
    'Cache-Control' => "max-age=#{1.year.to_i}" 
    } 
end 

這裏是我打電話給我的文件...

image_tag book.attachments.first.filename.file.authenticated_url(:thumb175)

它看起來對我來說,public_url預先考慮適當的主機,但它需要0參數...所以我怎麼通過正確的response-content-dispositionresponse-content-type和鏈接到期時間?

回答

0

我認爲你自己找到了這個,但公共網址不會過期。如果你想要的話,你需要使用認證的網址。對於公共網址,我認爲您可以簡單地獲取網址並附加所需的任何查詢參數,至少現在是這樣。如果這對你有好處,我們當然可以看到修補事情做正確的事情。

1

我有同樣的問題,花了太久的時間找出答案!事實證明,當你設置fog_public = false CarrierWave將忽略config.asset_host。您可以通過設置config.fog_public = true來演示此操作:您的網址現在將成爲CloudFront網址,而不是S3網址。此問題已得到前次募集:

https://github.com/carrierwaveuploader/carrierwave/issues/1158 https://github.com/carrierwaveuploader/carrierwave/issues/1215

在最近的一個項目,我很高興通過CarrierWave處理上傳到S3,但希望它使用Model.attribute_url當返回一個簽名的CloudFront的URL。我想出了以下(肯定是醜陋的)解決方法,我希望其他人可以從中受益或提高:

'cloudfront-signer' gem添加到您的項目並根據說明進行配置。然後加入/lib/carrierwave/uploader/url.rb的以下重寫一個新的文件中配置/初始化(注意:AWS :: CF的多次插入:: Signer.sign_url):

module CarrierWave 
     module Uploader 
     module Url 
      extend ActiveSupport::Concern 
      include CarrierWave::Uploader::Configuration 
      include CarrierWave::Utilities::Uri 

      ## 
      # === Parameters 
      # 
      # [Hash] optional, the query params (only AWS) 
      # 
      # === Returns 
      # 
      # [String] the location where this file is accessible via a url 
      # 
      def url(options = {}) 
      if file.respond_to?(:url) and not file.url.blank? 
       file.method(:url).arity == 0 ? AWS::CF::Signer.sign_url(file.url) : AWS::CF::Signer.sign_url(file.url(options)) 
      elsif file.respond_to?(:path) 
       path = encode_path(file.path.gsub(File.expand_path(root), '')) 

       if host = asset_host 
       if host.respond_to? :call 
        AWS::CF::Signer.sign_url("#{host.call(file)}#{path}") 
       else 
        AWS::CF::Signer.sign_url("#{host}#{path}") 
       end 
       else 
       AWS::CF::Signer.sign_url((base_path || "") + path) 
       end 
      end 
      end 

     end # Url 
    end # Uploader 
end # CarrierWave 

然後通過加入覆蓋/lib/carrierwave/storage/fog.rb下面以相同的文件的底部:

require "fog" 

module CarrierWave 
    module Storage 
    class Fog < Abstract 
     class File 
      include CarrierWave::Utilities::Uri 
      def url 
      # Delete 'if statement' related to fog_public 
      public_url 
      end 
     end 
    end 
    end 
end 

最後,在配置/初始值設定S/carrierwave.rb

config.asset_host = 「http://d12345678.cloudfront.net

config.fog_public =假

就是這樣。您現在可以使用Model.attribute_url,它會將已簽名的CloudFront URL返回到由CarrierWave上傳到您的S3存儲桶的私有文件。