错误:如何将映像从本地文件种子到数据库



Codecademy显示可以通过url (in seeds.rb):

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. 不能存储File.openFile.new返回的对象。它们只是引用流的IO对象(这里有更多信息)。至少你需要用File.read获取图像的内容,以便你可以存储它们并稍后使用它们。
  2. 一旦你在一个变量中有了图像的内容,你可以将它存储在你的数据库中。注意,这是一个很大的元素,你可能需要扩展你的存储。
  3. 让我们假设您可以从数据库中检索此内容。image_tag应该如何知道如何表示您存储的数据?

一旦你弄清楚了这一点,你可能想要分析一些如何实际实现它的选项:

。存储图像的二进制blob或64进制表示。在实际使用它之前,将其写入本地文件并将其作为image_tag的参数传递。缺点:效率很低。我把它作为一种选择,因为这是你首先要做的事情,但我认为这是不可行的。数据库没有被优化为在单个列条目中保存大量数据(对此持保留态度,因为这取决于DB引擎和查询数据的方式)。此外,从DB读取/写入本地文件相当慢,您需要尽可能快地提供该映像。

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

c。与CodeAcademy示例中一样,将图像保存在外部服务中,并保存对其的URL引用。有几个服务是专门为此设计的,比如AWS S3。这些都是高度优化的图像和文件的服务,这就是为什么它比自己服务的图像更好。但是当你足够大的时候,比如说,StackOverflow,你可能想要拥有自己的存储服务,因为密集使用可能比使用外部服务更好/更便宜。那么这些外部服务是如何做到的呢?它可以直接存储到磁盘上。然后,当您访问该url时,程序会像提供另一个文件一样提供该内容,但会添加必要的头,以便浏览器可以解释其内容(参见概念1)。如上图所示)。编辑: StackOverflow使用外部服务:imgur.com/gravatar.com,使用浏览器的"检查元素"工具,自己看看:)

快速回答:

User.first.image.attach(io: File.open("db/seeds-images/me.jpg"), filename: "me.jpg")

指出:

  • 我喜欢把一些图像直接放在db/seeds-images中,但是你可以把它们放在你喜欢的任何地方。

  • 答案基于这里

最新更新