我是rails的新手,如果这很容易就很抱歉。我想知道上传图片并在Ruby on Rails中显示它们的最佳方法。我有一个博客,并希望在创建帖子时可以选择附加图片。
答案 0 :(得分:25)
Paperclip非常棒。有一个很棒的RailsCast - http://railscasts.com/episodes/134-paperclip
答案 1 :(得分:18)
CarrierWave是一种比Paperclip更新的宝石,它看起来更灵活。 还有一个关于它的Railscast:http://railscasts.com/episodes/253-carrierwave-file-uploads
答案 2 :(得分:7)
假设您不需要花哨的功能,不希望添加依赖项并希望将图像存储为数据库中的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更完整的教程。
答案 3 :(得分:4)
许多人建议使用Carrierwave
,我不是例外,但我想指出一件事。在许多使用RoR编写的网站上(虽然它显然不仅仅是RoR问题)我注意到发送图片的请求可能会持续2-3秒,而且往往更多会占用应用程序实例(如果你正在使用线程或者不太关心性能,那可能不是那么可怕但是如果你正在使用独角兽那肯定是这样)。所以我将解释如何使用carrierwave来避免这种情况:
1)为你的应用程序选择一些后台工作者(我通常选择Sidekiq)
2)将carrierwave_backgrounder
添加到您的Gemfile并将其配置为与您的后台工作者和carrierwave(其自述文件中的所有内容)一起使用
我通常可以控制我的目录,所以我使用store_in_background
选项carrierwave_backgrounder
来处理并将图片存储在文件系统或S3中或者您正在使用的任何内容
3)现在,当您更新图片时,它的处理和存储会转到后台,从而释放您的应用程序实例,但需要一段时间,大多数情况下超过1秒,您需要向用户返回一些响应
4)为用户提供一些响应的最简单方法是返回javascript,在其中将旧图片更改为带有微调器或类似内容的gif,并设置javascript SetInterval
函数,检查图片是否有已处理(carrierwave_background
提供了一个函数,可以在完成处理时将模型的布尔列更改为true)每2秒发送一次AJAX
请求或您喜欢的任何内容,并在更改时更改图片它已被处理。
现在,您可以同时使用未应用的应用程序实例和良好的用户体验。
PS我对rails和web开发本身很陌生,因此本指南可能有一些我不会错过的警告
希望它会帮助某人。
哦,顺便说一下,这个名为refile
的新宝石,令人惊叹,在某些情况下可能是一个非常好的选择。
答案 4 :(得分:3)
很多人推荐PaperClip。也许你想先尝试使用它。
答案 5 :(得分:3)
CarrierWave可能是Rails中图片上传的最佳解决方案。 以下文章描述了使用CarrierWave进行图像上传的解决方案,同时在云中无缝地完成图像转换。上传的图像存储在云中并通过CDN传送。 无需安装RMagick,MiniMagick和ImageMagick。 http://cloudinary.com/blog/ruby_on_rails_image_uploads_with_carrierwave_and_cloudinary
答案 6 :(得分:2)
attachment_fu(http://github.com/technoweenie/attachment_fu
)是另一种选择,尽管我个人会推荐paperclip。它不需要Rmagick这是一个很大的优点,并且它支持一些很酷的功能,例如上传到S3并进行微小的配置。
答案 7 :(得分:1)
2018年9月
对于最近检查此问题的任何人,Rails 5.2+ now has ActiveStorage by default & I highly recommend checking it out.
由于它现在是Rails 5.2+核心的一部分,因此它具有很好的集成性并具有出色的开箱即用功能(仍然,所有其他著名的宝石,如Carrierwave,Shrine,回形针等,都很棒,但这一个提供了非常好的功能,我们可以在任何新的Rails项目中考虑这些功能
Paperclip团队不赞成使用Gem,而是使用Rails ActiveStorage。