2014-01-15 57 views
2

我使用的是Rails 4,Ruby 2.0,Paperclip 3.5.2。 我production.rb具有以下訪問保存在S3中的文件使用回形針

config.paperclip_defaults = { 
    :storage => :s3, 
    :s3_credentials => { 
    :bucket => ENV['S3_BUCKET_NAME'], 
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
    } 

我可以保存文件,我可以

`<%= image_tag card.ai.url(:thumb) %>` 

我的問題是檢索在view.html.erb的文件,我怎麼能訪問該文件在控制器中?我想將它添加到一個zip文件,Z:

def create_zip 
.... 
elsif ENV['RAILS_ENV'] == "production" 
     z.add_file(card.ai.path) 
... 
end 

這給出了錯誤:「無法打開文件:沒有這樣的文件或目錄」。還嘗試過「card.ai.url.path」 - 當然沒有用。 我讀過[回形針+ S3大量壓縮,但沒有我不想禁用任何東西。所以基本上有很多帖子說明如何在.html.erb文件中顯示圖像文件,但我想在控制器中訪問它。

- 所以即將完成

迄今已獲得這樣的......它不會崩潰的網站和temp_file不會進入zip文件,但temp_file是空的。

 s3One = AWS::S3.new(:access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
         :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']) 
     cardsets_bucket = s3One.buckets[ENV['S3_BUCKET_NAME']] 
     ai_file_object = cardsets_bucket.objects[card.ai] 

     temp_dir_name = "#{Rails.root}/public/temp/pictures}" 
     temp_dir = File.dirname("#{temp_dir_name}") 
     unless File.directory?("#{temp_dir_name}") 
      FileUtils.mkdir_p("#{temp_dir_name}") 
     end 
     if File.exists?("#{temp_dir_name}/tempPicture.jpg") 
      File.delete("#{temp_dir_name}/tempPicture.jpg") 
     end 
     temp_file = File.new("#{temp_dir_name}/tempPicture.jpg", 'w') 

     File.open("#{temp_dir_name}/tempPicture.jpg", 'w') do |file| 
      ai_file_object.read do |chunk| 
      file.write(chunk) 
      end 
     end 
     z.add_file("#{temp_dir_name}/tempPicture.jpg") 

也曾嘗試ai_file_object = cardsets_bucket.objects [card.ai.url] --still tempPicture是空的。還嘗試過card.ai.path,並導致錯誤AWS無法找到密鑰。

在此先感謝。

回答

2

我需要找出S3中的文件路徑,下載時使用「wb」。我看着我的開發公共/系統/卡片文件夾,看看回形針如何命名他們的文件。它是TABLENAME/ATTACHED_FILE/000/000/CARD.ID /原始。 (注意tablename和attached_file是複數,'original'可以用'thumb'代替)。 我也把這個放到視圖<%= card.ai.路徑%>,這給了我路徑

/cards/ais/000/000/001/original/startransparentbrownsmall.jpg

我的模型看起來是這樣的:

class Card < ActiveRecord::Base 
    belongs_to :cardset 
    ...  
    has_attached_file :ai, styles: { 
    thumb: '50x50>', 
    square: '100x100>', 
    medium: '200x200>' 
    } 
end 

下面是工作代碼:

 s3_file_path ="cards/ais/000/000/#{format("%03d", card.id)}/original/#{card.ai_file_name}" 
     temp_dir_name = "#{Rails.root}/public/temp/pictures/cards/ais/000/000/#{format("%03d", card.id)}/original" 

     temp_dir = File.dirname("#{temp_dir_name}") 
     unless File.directory?("#{temp_dir_name}") 
      FileUtils.mkdir_p("#{temp_dir_name}") 
     end 

     if File.exists?("#{temp_dir_name}/#{card.ai_file_name}") 
      File.delete("#{temp_dir_name}/#{card.ai_file_name}") 
     end 

     s3 = AWS::S3.new(:access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
         :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']) 
     bucket = s3.buckets[ENV['S3_BUCKET_NAME']] 

     File.open("#{temp_dir_name}/#{card.ai_file_name}", "wb") do |f| 
      f.write(bucket.objects["#{s3_file_path}"].read) 
     end 
     z.add_file("#{temp_dir_name}/#{card.ai_file_name}") 

這裏是一個幫助過我的網站:

http://docs.aws.amazon.com/AWSImportExport/latest/DG/ManipulatingS3KeyNames.html

1Is there a way to download a file from s3 using the ruby gem aws-s3?答案2通過Nicolas Blanco

0

我想你想urlpath

card.ai.path # => /bucket/model/id/file 
card.ai.url # => https://s3.amazonaws.com/bucket/model/id/file 

你可以進入軌道控制檯,並檢查這些值,以確保

z.add_file(card.ai.url) 
# or maybe 
z.add_file(open(card.ai.url)) 

你也可以檢查你的環境,像這樣 - 而不是檢查ENV直接

elsif Rails.env.production? 
    # ... 
+0

z.add_file(card.ai.url)沒有工作,也沒有打開(card.ai.url)。他們是否爲你工作?我一直在進一步閱讀,似乎我必須用適當的S3 :: Bucket向S3提供文件。 – flobacca

+0

看看'card.ai.url'返回並粘貼到瀏覽器 – house9

+0

http://s3.amazonaws.com/bucketname/pathtofile。當我把它放入瀏覽器時,它說拒絕訪問。我必須有一些方法告訴瀏覽器我的公鑰和私鑰。我已經在我的rails應用程序中給出了我的密鑰,但我不確定使用ruby語法來獲取文件。 – flobacca