上传图片Ruby on Rails
如果这很容易,我是新来的铁路如此抱歉。 我想知道最好的方式来上传图片,并在Ruby on Rails的显示。 我有一个博客,并希望在创buildpost时可以select添加图片。
回形针是相当真棒。 有一个很好的RailsCast关于它 – http://railscasts.com/episodes/134-paperclip
CarrierWave是比Paperclip更新的gem,看起来更加灵活。 还有一个关于它的Railscast: http ://railscasts.com/episodes/253-carrierwave-file-uploads
假设你不需要花哨的function,不希望添加依赖关系,并希望将图像作为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
这是一个更完整的教程的链接 。
许多人推荐使用Carrierwave
,我也不例外,但我想指出一件事。 在许多使用RoR编写的站点上(显然不仅仅是RoR问题),我注意到,发送图片的请求可能会等待2-3秒,而且通常甚至更多,这将绑定应用程序实例(可能并不可怕如果你使用线程或不关心性能,但肯定是如果你使用独angular兽)。 所以我会解释如何避免使用carrierwave:
1)为您的应用程序select一些背景工作(我通常与Sidekiq一起)
2)将carrierwave_backgrounder
添加到您的Gemfile中,并将其configuration为与您的后台工作人员和carrierwave(其自述文件中的所有内容)
我通常可以控制我的目录,所以我使用carrierwave_backgrounder
store_in_background
选项来处理和存储图片在文件系统或S3或任何你使用的
3)现在,当你更新图片的时候,它的处理和存储会转到后台,这会释放你的应用程序实例,但是这需要一段时间,大多数情况下需要超过1秒钟,而且你需要向用户返回一些响应
4)最简单的方法来提供用户一些响应是返回的JavaScript中,您更改旧图片为一个微调或类似的东西,并设置javascript的SetInterval
函数,检查图片是否已经处理( carrierwave_background
提供了一个函数可以在完成处理时将模型的布尔列更改为true)每隔2秒发送一次AJAX
请求或任何您喜欢的内容,并在处理完毕后更改图片。
现在你有一个解开的应用程序实例和一个良好的用户体验在同一时间。
PS我本身是新的轨道和Web开发本身,所以本指南可能有一些我已经错过的警告
希望它会帮助别人。
哦,顺便说一下,这个叫做refile
的新gem,这是惊人的,在某些情况下可以是一个非常好的select。
很多人推荐PaperClip 。 也许你想先尝试一下。
CarrierWave可能是在Rails中上传图片的最佳解决scheme。 以下文章描述了使用CarrierWave进行图像上传的解决scheme,而图像转换是在云中无缝完成的。 上传的图像存储在云中,并通过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
)是另一种select,虽然我个人会推荐回形针 。 它不需要Rmagick这是一个很大的优势,它支持一些很酷的function,如上传到S3configuration较小。