上传图片Ruby on Rails

bga*_*oci 38 ruby blogs file-upload ruby-on-rails

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

dan*_*ett 25

回形针非常棒.有一个很棒的RailsCast - http://railscasts.com/episodes/134-paperclip

  • 从这个答案开始,现在不建议使用回形针,而建议使用主动存储。 (2认同)

Fel*_*rda 18

CarrierWave是比Paperclip更新的宝石,它看起来更灵活.还有一个关于它的Railscast:http://railscasts.com/episodes/253-carrierwave-file-uploads


JRL*_*JRL 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
Run Code Online (Sandbox Code Playgroud)

控制器:

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
Run Code Online (Sandbox Code Playgroud)

这是一个更完整的教程的链接.

  • 避免在数据库中存储大块blob - 很少有这样的好主意. (5认同)

NoD*_*ame 5

许多人建议使用Carrierwave,我也不例外,但我想指出一件事。在许多使用RoR编写的网站上(虽然显然不仅是RoR问题),我注意到发送图片的请求可能会等待2-3秒,甚至更多的时间将应用程序实例捆绑在一起(可能并不那么糟糕)如果您使用的是线程或不太在乎性能,但绝对是(如果您使用的是独角兽)。因此,我将说明如何避免使用载波:

1)为您的应用程序选择一些后台工作人员(我通常会使用Sidekiq)

2)添加carrierwave_backgrounder到您的Gemfile并将其配置为与背景工作者和载波一起使用(自述文件中的所有内容)

我通常可以控制目录,因此可以store_in_background选择将carrierwave_backgrounder哪个进程存储图片并将其存储在文件系统或S3或任何您正在使用的文件中

3)现在,当您更新图片时,它的处理和存储将进入后台,这将释放您的应用程序实例,但需要花费一些时间,在大多数情况下,此过程需要1秒钟以上,并且您需要向用户返回一些响应

4)向用户提供一些响应的最简单方法是返回javascript,在该javascript中,您将旧图片更改为带有微调框或类似SetInterval功能的gif,然后设置javascript 函数来检查图片是否已处理(carrierwave_background提供了可以处理AJAX完毕后,将模型的布尔值列更改为true),每2秒发送一次请求,或者每2秒发送一次请求,并在处理完毕后更改图片。

现在,您可以同时拥有一个不受限制的应用程序实例和良好的用户体验。

PS我本身是Rails和Web开发的新手,因此本指南可能有一些我遗漏的警告

希望对别人有帮助。

哦,顺便说一句,有一个名为的新宝石refile,它很棒,在某些情况下可能是一个非常好的选择。