【问题标题】:Custom URL with Paperclip and AWS S3带有 Paperclip 和 AWS S3 的自定义 URL
【发布时间】:2015-06-27 16:13:24
【问题描述】:

我们正在使用带有 aws-sdk gem 的 Paperclip 在我们的 Rails 应用程序中存储和显示图像:

class User < ActiveRecord::Base
  has_attached_file :image,
                    storage: :s3,
                    s3_credentials: 'config/s3.yml',
                    s3_protocol: :https,
                    styles: {
                        curriculum: '120x120>',
                        medium: '600x600>',
                        thumb: '200x200>'
                    },
                    default_url: 'missing_photo.png'
end

如果我在 html.erb 文件中使用 &lt;%= image_tag current_user.image.url %&gt;,我会得到以下 HTML:&lt;img src="https://s3.amazonaws.com/&lt;my_bucket&gt;/users/images/000/000/001/medium/my_image.png?1419989041"&gt;

如何让 https://s3.amazonaws.com/&lt;my_bucket&gt; 成为像 https://example.com 这样的自定义 URL?我在 Cloudfront 中设置了所有域及其 SSL 证书。

我在Paperclip S3 Storage documentation 中查找。有一个 :url 选项,但我为该选项编写的任何内容似乎都不起作用。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 paperclip ruby-on-rails-4.2 aws-sdk


    【解决方案1】:

    我刚刚遇到了这个问题,这里是我必须使用的设置

    :s3_host_alias => "s3.example.com",
    :url => ":s3_alias_url",
    :path => ":class/:attachment/:id.:style.:extension"
    

    this link了解到,除了:s3_host_alias:url,你还得指定path,这样你就不会得到

    Paperclip::InfiniteInterpolationError
    

    有点效果很好,因为默认的回形针路径还是有点不稳定。

    【讨论】:

    • s3_alias_url 到底做了什么?
    【解决方案2】:

    更新

    我整理了一个示例,并能够使其与以下内容一起使用:

    class User < ActiveRecord::Base
    
      has_attached_file :profile_picture,
                    styles: { :medium => "300x300>", :thumb => "100x100>" },
                    path: 'users/:attachment/:style-:hash.:extension',
                    hash_secret: "94dfda08e2ed473257345563594dfda08e2ed473257345563594dfda08e2ed473257345563594dfda08e2ed4732573455635",
                    default_url: "/images/:style/missing.png",
                    storage: :s3,
                    s3_protocol: 'http',
                    url: ':s3_alias_url',
                    s3_host_alias: 'distro1234.cloudfront.net',
                    s3_credentials: {
                      access_key_id: 'access_id',
                      secret_access_key: 's3cr3tK3y!',
                      acl: 'private',
                      bucket: 'my-bucket',
                      bucket_url: 'https://my-bucket.s3.amazonaws.com',
                    }
    
      validates_attachment_content_type :profile_picture, :content_type => /\Aimage\/.*\Z/
    

    结束

    还有以下Gemfile

    gem 'paperclip'
    gem 'aws-sdk', '~> 1.5.7'
    

    Rails 控制台:

    => u.profile_picture.url
    => "http://distro1234.cloudfront.net/users/profile_pictures/original-95eb509f9c81a341945a5a65e59e81880a739d39.jpg?1429638820"
    

    试试这样的:

    has_attached_file :image,
                    storage: :s3,
                    s3_credentials: 'config/s3.yml',
                    s3_protocol: :https,
                    styles: {
                        curriculum: '120x120>',
                        medium: '600x600>',
                        thumb: '200x200>'
                    },
                    url: ':s3_alias_url',
                    s3_host_alias: 'example.com',  
                    default_url: 'missing_photo.png'
    

    【讨论】:

    • 你可能还需要将s3_protocol 设置为https
    • 当我添加url: ':s3_alias_url', 时,我在显示照片的页面上收到错误“没有将符号隐式转换为字符串”。
    • 实际上,“没有隐式转换”错误是当我有 :s3_alias_url 本身没有引号时。使用 :s3_alias_url 周围的引号,我收到此错误:“Paperclip::Errors::InfiniteInterpolationError”
    • @at。我用一个在新 S3 存储桶上测试的工作示例更新了答案
    • 发生了什么变化?我看不出我会添加什么来让它工作..hash_secret 是我没有的东西......也许我会尝试一下。
    猜你喜欢
    • 2014-05-15
    • 2016-09-08
    • 1970-01-01
    • 2023-03-29
    • 2018-10-20
    • 2012-05-02
    • 2021-06-17
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多