2013-04-30 107 views
2

我正在使用帶有霧存儲的carrierwave的導軌應用程序。我的表單中有幾個字段,用戶可以在其中提交一個應用程序(名稱,簡稱&長描述,圖像字段)。上傳文件的名稱是從我的表單的「名稱」字段中的字段名稱獲取的。使用「+」號讀取S3存儲桶文件時,亞馬遜S3訪問被拒絕

例如,當我上傳名爲Notepad的文件時,一切正常,圖像顯示在我的應用程序頁面上。但是,當我在表單域中上傳名爲Notepad++的圖像時,它會成功上傳到亞馬遜,但是我得到一張破損的圖像。查看其源,並試圖打開它的URL會產生一個錯誤

<Error> 
    <Code>AccessDenied</Code> 
    <Message>Access Denied</Message> 
    <RequestId>0DBACCF4C0301B02</RequestId> 
    <HostId> 
     raYVzr9xubG0NA/b57saIJzfc2YhnvhD0tafYmo34ewOBY6/0j1AKUFC/lEoY+6h 
    </HostId> 
</Error> 

出現這種情況與加號的所有名稱。可能是什麼問題呢。我嘗試了所有我可以但沒有的東西。這是我的image_uploader類

# encoding: utf-8 

class ImageUploader < CarrierWave::Uploader::Base 

    include CarrierWave::RMagick 

    storage :fog 

    include CarrierWave::MimeTypes 
    process :set_content_type 

    def store_dir 
     "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.name.to_s.downcase.underscore || model.id.to_s.underscore.downcase}" 
    end 

    def filename 
     "#{model.name.to_s.underscore.downcase}-#{secure_token}" if original_filename.present? 
    end 

    def default_url 
     "fallback/#{model.class.to_s.underscore}/" + [version_name, "noimage.gif"].compact.join('_') 
    end 

    version :nano_thumb do 
     process :resize_to_fill => [20, 20] 
    end 

    version :mini_thumb do 
     process :resize_to_fill => [25, 25] 
    end 

    version :small_thumb do 
     process :resize_to_fill => [34, 34] 
    end 

    version :thumb do 
     process :resize_to_fill => [48, 48] 
    end 

    version :small do 
     process :resize_to_fill => [86, 86] 
    end 

    version :medium do 
     process :resize_to_fill => [259, 259] 
    end 

    version :large do 
     process :resize_to_fill => [518, 518] 
    end 

    def extension_white_list 
     ["jpg", "jpeg", "gif", "png", ""] 
    end 

    protected 
    def secure_token(length=9) 
     var = :"@#{mounted_as}_secure_token" 
     model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2)) 
    end 

    end 

感謝

回答

2

最大的可能是您沒有正確編碼URL,如「+」號必須是URL編碼的第一。

我建議您運行某種流量分析器工具(例如Wireshark),並查看您發送到Amazon S3服務器的流量類型。

希望它有幫助!

+0

感謝它實際上沒有正確編碼字符的gem'carrierwave'。 – 2013-05-02 17:48:54

3

這是carrierwave中的一個已知問題,它已被固定在master上但尚未發佈。您的選擇是:

  1. 使用carrierwave master而不是官方gem版本。

  2. 更新sanitize_regexp以排除+字符。

    CarrierWave :: SanitizedFile.sanitize_regexp = /[^a-zA-Z0-9.-_]/

新的上傳影片將與任一工作,但你仍然必須修復手動(通過s3查找正確的文件名,然後更新數據庫)。或者只是刪除它們。

+0

非常感謝您的見解。它真的幫助了我 – 2013-05-02 17:50:47