无法让 Paperclip 正确设置我的 S3 URL

Can't get Paperclip to set my S3 URLs properly

我在 Rails 4 应用程序中使用回形针和 aws-sdk gem。

我在 paperclip.rb 配置中定义了 :path 选项,没有 :url 选项:

Paperclip::Attachment.default_options[:path] = ":class/:attachment/:id_partition/:style/:filename"

它会像这样保存我上传的图片:

http://s3.amazonaws.com/mybucket-development/profiles/avatars/000/000/026/original/image_file_name.png?1420575189

很好,它已保存到 S3。但是它拒绝让我阅读要显示的图像,例如=profile.avatar.url(:中等)。当我在浏览器中转到 URL 时,它告诉我使用存储桶名称作为域重新格式化它。喜欢:

http://mybucket-development.s3.amazonaws.com/profiles/avatars/000/000/026/original/image_file_name.png?1420575189

好的,也不是问题。我去那个URL,我可以查看我的图像。所以现在我需要弄清楚如何让 Paperclip 像这样自动格式化 URLs。我在 Paperclip 文档中读到,您只需设置

Paperclip::Attachment.default_options[:url] = ":s3_domain_url"

而且我还必须设置 :path 参数,否则我只会得到一个 Paperclip::Errors::InfiniteInterpolationError。

所以我设置了我的配置文件:

Paperclip::Attachment.default_options[:path] = ":class/:attachment/:id_partition/:style/:filename"
Paperclip::Attachment.default_options[:url] = ":s3_domain_url"

不工作...我尝试废弃 paperclip.rb 并将其放入 config/environments/* 但无论我做什么,它仍然保存没有域的 URLs在路径中使用存储桶名称。

所以两个问题:

1) 如何让 Paperclip 以域样式自动格式化保存的 URLs?

2) 或者更好的是,我怎样才能让 S3 接受非域样式 URLs,Paperclip 当前正在生成的样式?

编辑

所以,如果我添加 s3_host_name 选项,那么它会保存 URLs 域样式。所以我必须拥有所有 3 个:

Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = ":class/:attachment/:id_partition/:style/:filename"
Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-west-2.amazonaws.com'

它会像这样在模型上保存我的 URLs:

http://mybucket-development.s3-us-west-2.amazonaws.com/profiles/avatars/000/000/026/original/image_file_name.png%3F1420580224

但现在我看到我在 URL 中有一个 %3F 编码(“?”),这把它搞砸了。

好吧,正如上面更新中提到的,为了让 Paperclip 保存域样式的 URL,我必须在我的 paperclip.rb 中包含以下所有 3 个:

Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = ":class/:attachment/:id_partition/:style/:filename"
Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-west-2.amazonaws.com'

我认为最近的 gem 升级存在一个相关问题,这会生成其编码无法自行运行的 URL。

所以在我看来我不得不添加 URI.unescape,比如

=image_tag URI.unescape(profile.avatar.url(:medium))

我还可以在模型上设置回调以将 %3F 替换为“?”保存前。

Paperclip 出现奇怪问题...不确定发生了什么。我开发的第一个应用遇到了这个问题。

在paperclip.rb

Paperclip::Attachment.default_options[:s3_host_name] = 's3-ap-south-1.amazonaws.com'

在production.rb

config.paperclip_defaults = {
           storage: :s3,
           s3_protocol: :https,
           s3_credentials: {
           bucket: ENV.fetch('S3_BUCKET_NAME'),
           access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
           secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
           s3_region: ENV.fetch('AWS_REGION')
 }

这对我 image_tag 来说非常有效。它应该也适合你。