【问题标题】:Serving static big images rails为静态大图像提供服务
【发布时间】:2015-03-31 16:11:40
【问题描述】:

我目前从 CDN 为我的应用程序中的所有图像提供服务。图片位于我的 rails 应用程序中的 app/assets/images 文件夹中。

并且应用程序预编译后,所有资产都上传到CDN,效果很好。

但是,有十几个大图像文件几乎从不改变,主要是在用户未登录时提供给用户,作为轮播或其他东西的一部分。

所以万一新的应用程序版本出来了,那些静态图像会重新上传,用户必须重新下载它们但它们永远不会改变,所以这有点多余,而且对于大尺寸来说并不是真的没有意义。

我的想法是把图片放在vendor/assets/images,直接加载到我的app中,不用app生成的后缀/hash。例如:如果您的应用中有名为 2.jpg 的图像,则在预编译资产后,它可能会以 2-49d87927b61510021a3cd0a895502625.jpg 或类似名称保存到 CDN。

所以我现在将上面的图片添加为:

= image_tag('2.jpg', alt: '')

但由于我的 assets.rb 初始化程序中有这一行:

Rails.application.config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif)

图像2.jpg 将在生产环境中使用哈希进行预编译。

那么我怎样才能使用这个没有在 prod 上使用 hash 预编译但保持不变的图像呢?

如果我说:

= image_tag('2.jpg', alt: '')

它应该呈现为<image src='http://CDN_URL/assets/2.jpg' /> 而不是<image src='CND_URL/assets/2-23123dasdasdsadsasad21312.jpg' />,因为这个在vendor/assets/images 之下我仍然希望我的常规图像app/assets/images 带有哈希值。这可能吗?以及如何?

更新:

在我的开发环境中,我不提供静态资产。只是一个常规的开发配置。但我更喜欢适用于(DEV 和 PROD)环境的解决方案。

更新二:

看起来%img{src: 'assets/2.jpg'}vendor/assets/images 加载文件,这很好。

当我预编译资产并在 assets.rb 中使用 Rails.application.config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif) 使用哈希初始化图像时,另一个问题仍然存在,即 2-32131dasdaeasee12eda.jpg

如果我从配置中删除 Rails.application.config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif),则不会将图像 2.jpg 复制到 public/assets,因此不会复制到 CDN。

【问题讨论】:

  • 为什么不使用<img src="yourcdn.com/images/1.png">?为您的静态图像。 image_tag 将始终附加 md5 掩码(或您使用的任何内容)
  • @Avdept %img{src: 'images/2.png'} 甚至不能在本地主机上工作。在我不提供静态资产的开发中
  • 不应该像'/images/2.png'吗?
  • @Avdept 不,实际上%img{src: 'assets/2.jpg'} 在本地主机上工作。但问题的另一部分是,当我预编译时,没有将2.jpg 的图像文件复制到公共资产文件夹。
  • 来自 Rails 文档 当文件内容改变时,文件名也会改变。 所以如果你的图像没有改变,那么它不会在预编译时生成新的文件哈希

标签: ruby-on-rails ruby ruby-on-rails-4 cdn


【解决方案1】:

你的问题的前提不正确:

所以万一新的应用程序版本出来了,那些静态图像会重新上传,用户必须重新下载它们但它们永远不会改变,所以这有点多余,而且对于大尺寸来说并不是真的没有意义。

哈希指纹是文件内容的 MD5。如果文件没有改变,那么指纹也不会改变。您没有理由需要为大文件设置例外 - 系统应该完全按照您的意愿工作,无需自定义流程。

【讨论】:

  • 如果属实,这太棒了。我会测试一下,谢谢
  • @GandalfStormCrow 这就是指纹识别的重点。添加的数字不是任意的。
【解决方案2】:

如果您想在没有指纹或资产管道的任何其他好处的情况下静态提供文件,那么不要使用资产管道

将您的文件放入/public

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2017-07-30
    • 2020-02-21
    • 1970-01-01
    • 2021-04-13
    • 2017-04-11
    相关资源
    最近更新 更多