Ruby on rails 使用回形针访问保存在S3中的文件
我使用的是Rails 4、Ruby 2.0、回形针3.5.2。 My production.rb具有以下特性Ruby on rails 使用回形针访问保存在S3中的文件,ruby-on-rails,amazon-s3,paperclip,Ruby On Rails,Amazon S3,Paperclip,我使用的是Rails 4、Ruby 2.0、回形针3.5.2。 My production.rb具有以下特性 config.paperclip_defaults = { :storage => :s3, :s3_credentials => { :bucket => ENV['S3_BUCKET_NAME'], :access_key_id => ENV['AWS_ACCESS_KEY_ID'], :secret_access_key =>
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) %>`
这会产生错误:“无法打开文件:没有这样的文件或目录”。还尝试了“card.ai.url.path”-当然没用。
我读过[Paperclip+S3 massive zipping],但不,我不想禁用任何东西。因此,基本上有很多帖子说如何在.html.erb文件中显示图像文件,但我想在控制器中访问它
-就快结束了
到目前为止…它不会使网站崩溃,临时文件也会进入zip文件,但临时文件是空的
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]--仍然tempPicture为空。还尝试了card.ai.path并导致错误AWS找不到密钥
提前谢谢。我想你想要的是
url
而不是path
card.ai.path # => /bucket/model/id/file
card.ai.url # => https://s3.amazonaws.com/bucket/model/id/file
您可以进入rails控制台并检查这些值以确保
z.add_file(card.ai.url)
# or maybe
z.add_file(open(card.ai.url))
您也可以像这样检查您的环境,而不是直接检查ENV
elsif Rails.env.production?
# ...
我需要找出S3中的文件路径,并在下载时使用“wb”。我查看了我的development public/system/cards文件夹以查看回形针如何命名他们的文件。它是TABLENAME/ATTACHED_file/000/CARD.ID/original。(注意TABLENAME和ATTACHED_file是复数形式,“original”可以替换为“thumb”。) 我也把它放到一个视图中,它给了我路径 /卡片/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
以下是帮助我的网站:
:Nicolas Blanco的答案2z.add_文件(card.ai.url)不起作用,也没有打开(card.ai.url)。它们对你有用吗?我一直在深入阅读,似乎我必须向aws S3索取带有正确S3::Bucket的文件。查看
card.ai.url
返回的内容并将其粘贴到浏览器中。当我将其放入浏览器时,它会说访问被拒绝。我必须有某种方式告诉浏览器我的公钥和私钥。我已经给出了我的密钥在我的rails应用程序中,但我不确定将文件导出的ruby语法。card.ai.expiring\u url(600)
将生成一个有效期为5分钟的签名链接我不寻找链接,我需要压缩文件。我不确定你的计划是什么。
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}")