【问题标题】:Accessing a file saved in S3 Using Paperclip使用 Paperclip 访问保存在 S3 中的文件
【发布时间】:2014-01-18 10:11:25
【问题描述】:

我正在使用 Rails 4、Ruby 2.0、Paperclip 3.5.2。 我的 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']
  }
  }

我可以保存文件,也可以使用

检索 view.html.erb 中的文件
  `<%= image_tag card.ai.url(:thumb) %>`

我的问题是,如何访问控制器中的文件?我想将它添加到一个 zip 文件中,z:

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

这给出了错误:“无法打开文件:没有这样的文件或目录”。还尝试了“card.ai.url.path”——当然没有用。 我读过 [Paperclip + 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 = cardets_bucket.objects[card.ai.url] -- 仍然 tempPicture 是空的。还尝试了 card.ai.path 并导致错误 AWS 找不到密钥。

提前致谢。

【问题讨论】:

    标签: ruby-on-rails amazon-s3 paperclip


    【解决方案1】:

    我需要找出 S3 中的文件路径并在下载时使用“wb”。我查看了我的开发 public/system/cards 文件夹,以查看回形针如何命名他们的文件。它是 TABLENAME/ATTACHED_FILE/000/000/CARD.ID/original。 (注意 tablename 和 attach_file 是复数,“original”可以替换为“thumb”。) 我还把它放到了一个视图 中,它给了我路径

    /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

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

    【讨论】:

      【解决方案2】:

      我想你想要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?
        # ...
      

      【讨论】:

      • z.add_file(card.ai.url) 不起作用,open(card.ai.url) 也不起作用。他们为你工作了吗?我一直在进一步阅读,看来我必须向 aws S3 询问具有正确 S3::Bucket 的文件。
      • 查看 card.ai.url 返回的内容并将其粘贴到浏览器中
      • s3.amazonaws.com/bucketname/pathtofile。当我将它放入浏览器时,它说访问被拒绝。我必须以某种方式告诉浏览器我的公钥和私钥。我已经在我的 rails 应用程序中提供了我的密钥,但我不确定将文件取出的 ruby​​ 语法。
      • card.ai.expiring_url(600) 将生成一个有效期为 5 分钟的签名链接
      • 我不是在寻找链接,我需要压缩文件。我不太确定你的计划是什么。
      猜你喜欢
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      相关资源
      最近更新 更多