Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用回形针访问保存在S3中的文件_Ruby On Rails_Amazon S3_Paperclip - Fatal编程技术网

Ruby on rails 使用回形针访问保存在S3中的文件

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 =>

我使用的是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 => 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的答案2

z.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}")