【发布时间】:2010-12-23 20:27:42
【问题描述】:
我是 Rails 新手,如果这很简单,我很抱歉。我想知道上传图片并在 Ruby on Rails 中显示它们的最佳方式。我有一个博客,并希望在创建帖子时可以选择附加图片。
【问题讨论】:
标签: ruby-on-rails ruby file-upload blogs
我是 Rails 新手,如果这很简单,我很抱歉。我想知道上传图片并在 Ruby on Rails 中显示它们的最佳方式。我有一个博客,并希望在创建帖子时可以选择附加图片。
【问题讨论】:
标签: ruby-on-rails ruby file-upload blogs
回形针非常棒。有一个很棒的 RailsCast - http://railscasts.com/episodes/134-paperclip
【讨论】:
CarrierWave 是一种比 Paperclip 更新的 gem,而且它看起来更加灵活。 还有一个关于它的 Railscast:http://railscasts.com/episodes/253-carrierwave-file-uploads
【讨论】:
假设您不需要花哨的功能,不希望添加依赖项并希望将图像作为 BLOB 存储在数据库中,您可以执行以下操作:
型号:
class Image < ActiveRecord::Base
def img=(input_data)
self.filename = input_data.original_filename
self.filetype = input_data.content_type.chomp
self.img = input_data.read
end
end
控制器:
class ImagesController < ApplicationController
def display_img
@img = Image.find(params[:id])
send_data(@img.img, :type => @img.filetype, :filename => @img.filename,
:disposition => 'inline')
end
end
Here's a link 获取更完整的教程。
【讨论】:
许多人建议使用Carrierwave,我也不例外,但我想指出一件事。在许多使用 RoR 编写的网站上(显然不仅是 RoR 问题),我注意到发送图片的请求可能会等待 2-3 秒,甚至更长时间,这会占用应用程序实例(这可能不是那么糟糕)如果您使用线程或不太关心性能,但如果您使用的是独角兽,那肯定是这样)。所以我将解释如何使用载波来避免这种情况:
1) 为您的应用选择一些后台工作人员(我通常使用 Sidekiq)
2) 将carrierwave_backgrounder 添加到您的 Gemfile 中,并将其配置为与您的后台工作人员和 carrierwave 一起使用(其自述文件中的所有内容)
我通常可以控制我的目录,所以我使用 carrierwave_backgrounder 的 store_in_background 选项,它处理并将图片存储在文件系统或 S3 或您正在使用的任何东西中
3) 现在,当您更新图片时,它的处理和存储将转到后台,这会释放您的应用程序实例,但需要一段时间,在大多数情况下超过 1 秒,并且您需要向用户返回一些响应
4) 向用户提供一些响应的最简单方法是返回 javascript,在其中您将旧图片更改为带有微调器或类似工具的 gif,并设置 javascript SetInterval 函数来检查图片是否已被处理(carrierwave_background 提供了一个函数,可以在处理完成后将模型的布尔列更改为 true)每 2 秒发送一次AJAX 请求或任何您喜欢的请求,并在处理完成后更改图片。
现在您拥有一个未绑定的应用程序实例和良好的用户体验。
PS 我是 Rails 和 Web 开发本身的新手,所以本指南可能有一些我错过的警告
希望对某人有所帮助。
哦,顺便说一句,有一个名为 refile 的新宝石,它非常棒,在某些情况下可能是一个非常好的选择。
【讨论】:
很多人推荐PaperClip。也许您想先尝试使用它。
【讨论】:
CarrierWave 可能是 Rails 中图片上传的最佳解决方案。 以下帖子描述了使用 CarrierWave 上传图像的解决方案,同时图像转换在云中无缝完成。上传的图像存储在云端并通过 CDN 交付。 无需安装 RMagick、MiniMagick 和 ImageMagick。 http://cloudinary.com/blog/ruby_on_rails_image_uploads_with_carrierwave_and_cloudinary
【讨论】:
attachment_fu (http://github.com/technoweenie/attachment_fu) 是另一种选择,尽管我个人会推荐paperclip。它不需要 Rmagick,这是一个很大的优势,它支持一些很酷的功能,比如通过少量配置上传到 S3。
【讨论】:
对于最近检查此问题的任何人,Rails 5.2+ now has ActiveStorage by default & I highly recommend checking it out.
由于它现在是核心 Rails 5.2+ 的一部分,因此它集成得非常好,并且具有开箱即用的出色功能(仍然所有其他知名的宝石,如 Carrierwave、Shrine、回形针......一个提供了非常好的功能,我们可以考虑用于任何新的 Rails 项目)
Paperclip 团队弃用了 gem,转而支持 Rails ActiveStorage。
Here is the github page for the ActiveStorage&海量资源随处可见
请注意,ActiveStorage 中不提供一些高级功能,但如果您的用例很简单,它可能是最容易安装并与第三方云存储(s3、数字海洋空间、.. ..)
例如,其中一个主要缺点是您无法在 ActiveStorage 中为上传定义路径,有一个 hack 可以做到这一点,这样每个环境都会上传到不同的路径(但这仍然是一个很大的问题)对我来说很烦恼)
如果您的上传需要更多灵活性和高级功能,我建议您查看 Shrine
Shrine comparison with other gems, as per their official page
【讨论】: