RoR:如何从本地文件将图像播种到我的数据库

时间:2015-09-03 00:13:10

标签: ruby-on-rails ruby database

Codecademy显示可以通过类似(在seeds.rb中)的URL来播种图像:

t1 = Tag.create(title: "Beaches", image: "http://s3.amazonaws.com/codecademy-content/courses/learn-rails/img/beach01.jpg")
Destination.create(name: "Ipanema", description: "The beach of Ipanema is known for its elegant development and its social life.", image: "http://s3.amazonaws.com/codecademy-content/courses/learn-rails/img/beach02.jpg", tag_id: t1.id)

但是,如果我想要使用本地文件呢?我的文件路径由Ruby提供

File.join(Rails.root,'db','images','Event1.jpg')

我尝试使用

image: File.open(File.join(Rails.root,'db','images','Event1.jpg'))

取代

image: "http://s3.amazonaws.com/codecademy-content/courses/learn-rails/img/beach02.jpg"

但它不起作用。

目前我正在使用

访问视图中的图像
<%= image_tag t.image %>

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

你必须首先围绕一些概念:

  1. 您无法存储File.openFile.new返回的对象。这些只是引用流的IO对象(更多关于它here)。至少您需要使用File.read获取图片的内容,以便您可以存储它们并在以后使用它们。
  2. 将图像内容放入变量后,您可以将其存储在数据库中。请注意,这是一个很大的元素,您可能需要扩展存储空间。
  3. 假设您可以从数据库中检索此内容。 image_tag如何知道如何表示您存储的数据?
  4. 一旦弄明白,你可能想要分析一些关于如何实际实现它的选项:

    一个。存储图像的二进制blob或base 64表示。在实际使用它之前,将其写入本地文件并将其作为image_tag的参数传递。缺点:非常低效。我把它作为一种选择,因为它是你首先尝试做的,但我不认为它是可行的。数据库未经过优化,无法在单个列条目中保存大量数据(因为它取决于数据库引擎和查询数据的方式)。此外,从DB /写入本地文件的读取速度非常慢,您需要尽可能快地提供该图像。

    湾存储对文件的引用,并在本地保存图像(例如,可以放在app/assets/images中)。然后,您可以使用image_tag Rails.root.join('app', 'assets', 'images', t.filename)引用它。缺点:没有直接的方式知道您的图像可用。

    ℃。与CodeAcademy示例一样,将图像保存在外部服务中并保存对其的URL引用。有几种专门为此设计的服务,例如AWS S3。这些都是高度优化的,通常用于提供图像和文件,这就是为什么它比自己提供图像更好的原因。但是当你足够大,比如StackOverflow时,你可能想拥有自己的存储服务,因为密集使用可能比使用外部服务更好/更便宜。那么这些外部服务如何做到呢?可以将其直接存储到磁盘。然后当您访问该URL时,程序就像另一个文件一样提供该内容,但是放置必要的标题以便您的浏览器可以解释其内容(参见上面的概念1)。 修改:StackOverflow确实使用外部服务:imgur.com/gravatar.com,使用&#34; Inspect Element&#34;浏览器的工具,亲眼看看:)