ruby RoR:如何从本地文件将图像种子到数据库

t30tvxxf  于 2023-08-04  发布在  Ruby
关注(0)|答案(2)|浏览(113)

Codecademy展示了一个可以通过URL(在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 %>


我如何才能做到这一点?

ff29svar

ff29svar1#

首先,你必须了解一些概念:
1.不能存储File.openFile.new返回的对象。这些只是引用流的IO对象(这里有更多关于它的信息)。至少您需要使用File.read获取图像的内容,以便您可以存储它们并在以后使用它们。
1.一旦你有一个变量中的图像的内容,你可以存储在您的数据库。请注意,这是一个很大的元素,您可能需要扩展存储。
1.让我们假设您可以从数据库中检索此内容。image_tag如何知道如何表示存储的数据?
一旦你弄清楚了这一点,你可能想分析一些关于如何实际实现它的选项:
a.存储图像的二进制blob或base 64表示。在实际使用它之前,将它写入本地文件并将其作为image_tag的参数传递。缺点:very efficient.我把它作为一个选项,因为这是你试图做的摆在首位,但我不认为这是可行的。数据库并没有被优化为在单个列条目中保存大量数据(对此持保留态度,因为这取决于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,使用浏览器的“检查元素”工具,自己看看:)

fdx2calv

fdx2calv2#

快速回答:

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

字符串
备注:

  • 我喜欢把一些图像直接放在一个名为db/seeds-images的文件中,但是你可以把它们放在任何你喜欢的地方。
  • 基于here的答案

相关问题