bga*_*oci 38 ruby blogs file-upload ruby-on-rails
我是新手,如果这很容易就很抱歉.我想知道上传图片并在Ruby on Rails中显示它们的最佳方法.我有一个博客,并希望在创建帖子时可以选择附加图片.
dan*_*ett 25
回形针非常棒.有一个很棒的RailsCast - http://railscasts.com/episodes/134-paperclip
假设您不需要花哨的功能,不希望添加依赖项并希望将图像存储为数据库中的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)
许多人建议使用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,它很棒,在某些情况下可能是一个非常好的选择。
| 归档时间: |
|
| 查看次数: |
60970 次 |
| 最近记录: |