上传图片Ruby on Rails

时间:2009-12-07 00:46:59

标签: ruby-on-rails ruby file-upload blogs

我是rails的新手,如果这很容易就很抱歉。我想知道上传图片并在Ruby on Rails中显示它们的最佳方法。我有一个博客,并希望在创建帖子时可以选择附加图片。

8 个答案:

答案 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。

Here is the github page for the ActiveStorage和大量资源随处可见