如何显示从 Mongoid::GridFs 返回的图像
How to display image returned from Mongoid::GridFs
我正在尝试在 rails_admin gem 的记录行中显示保存在 Mongo 中的图像。
我有我的模型保存,我的图像保存,我正在模型记录中保存图像 ID。
这是我的模型:
require 'mongoid/grid_fs'
class Asset
include Mongoid::Document
field :data_file_name, type: String
field :data_content_type, type: String
field :data_file_size, type: Integer
field :image_id, type: String
end
这是我在 rails_admin.rb 中尝试为我的资产模型做的事情:
list do
field :id
field :data_file_name
field :data_content_type
field :data_file_size
field :image do
formatted_value do
grid_fs = Mongoid::GridFs
bindings[:view].tag(:img, { :src => grid_fs.get(bindings[:object].image_id)})
end
end
end
下面是负责保存模型和图像的操作:
register_instance_option :controller do
proc do
if request.get? # EDIT
respond_to do |format|
format.html { render @action.template_name }
format.js { render @action.template_name, layout: false }
end
elsif request.put? # UPDATE
tempFile = params[:picture][:asset].tempfile
file = File.open(tempFile)
grid_fs = Mongoid::GridFS
grid_file = grid_fs.put(file.path)
Asset.new.tap do |asset|
asset.data_file_name = params[:picture][:asset].original_filename
asset.data_content_type = params[:picture][:asset].content_type
asset.data_file_size = ::ApplicationController.helpers.number_to_human_size(File.size(tempFile))
asset.image_id = grid_file.id
asset.save
binding.pry
end
end
end
end
模型正在保存,我可以在 fs.files 和 fs.chunks 中看到文件保存,但目前,我只在记录行中看到以下内容:
更新:
我现在尝试从 mongo 获取文件(这似乎可行),然后使用文件的实际文件名显示图像。
field :image do
formatted_value do
grid_fs = Mongoid::GridFs
f = grid_fs.get(bindings[:object].image_id)
bindings[:view].tag(:img, { :src => f.filename})
end
end
不幸的是,这并没有改变任何东西。尝试在新选项卡中打开图片会将我带到以下内容 link:/admin/asset#<Mongoid::GridFs::Fs::File:0x981vj5ry>
更新 2:
已将 field :image_id, type: String
更改为 field :image_id, type: BSON::ObjectId
结果没有变化。
如果您在 GridFS 中保存图像数据,则需要在您的应用程序中有一个端点以从 GridFS 检索该图像数据并将其提供给应用程序。有关如何提供图像数据的信息,请参阅此答案:Rails - How to send an image from a controller
然后,link 到此端点而不是 linking 到 "f.filename",正如您在上一个代码片段中指出的那样。
经过大量研究,您似乎可以将从 grid_fs
返回的数据编码为 base64。
反过来,您可以通过将源指定为 data:image/png;base64,+base64Image
来使用它来显示图像,如下所示:
field :asset_thumbnail do
formatted_value do
grid_fs = Mongoid::GridFs
f = grid_fs.get(bindings[:object].thumb_image_id)
b64 = Base64.strict_encode64(f.data)
bindings[:view].tag(:img, { :src => "data:image/png;base64,"+b64})
end
end
我正在尝试在 rails_admin gem 的记录行中显示保存在 Mongo 中的图像。
我有我的模型保存,我的图像保存,我正在模型记录中保存图像 ID。
这是我的模型:
require 'mongoid/grid_fs'
class Asset
include Mongoid::Document
field :data_file_name, type: String
field :data_content_type, type: String
field :data_file_size, type: Integer
field :image_id, type: String
end
这是我在 rails_admin.rb 中尝试为我的资产模型做的事情:
list do
field :id
field :data_file_name
field :data_content_type
field :data_file_size
field :image do
formatted_value do
grid_fs = Mongoid::GridFs
bindings[:view].tag(:img, { :src => grid_fs.get(bindings[:object].image_id)})
end
end
end
下面是负责保存模型和图像的操作:
register_instance_option :controller do
proc do
if request.get? # EDIT
respond_to do |format|
format.html { render @action.template_name }
format.js { render @action.template_name, layout: false }
end
elsif request.put? # UPDATE
tempFile = params[:picture][:asset].tempfile
file = File.open(tempFile)
grid_fs = Mongoid::GridFS
grid_file = grid_fs.put(file.path)
Asset.new.tap do |asset|
asset.data_file_name = params[:picture][:asset].original_filename
asset.data_content_type = params[:picture][:asset].content_type
asset.data_file_size = ::ApplicationController.helpers.number_to_human_size(File.size(tempFile))
asset.image_id = grid_file.id
asset.save
binding.pry
end
end
end
end
模型正在保存,我可以在 fs.files 和 fs.chunks 中看到文件保存,但目前,我只在记录行中看到以下内容:
更新:
我现在尝试从 mongo 获取文件(这似乎可行),然后使用文件的实际文件名显示图像。
field :image do
formatted_value do
grid_fs = Mongoid::GridFs
f = grid_fs.get(bindings[:object].image_id)
bindings[:view].tag(:img, { :src => f.filename})
end
end
不幸的是,这并没有改变任何东西。尝试在新选项卡中打开图片会将我带到以下内容 link:/admin/asset#<Mongoid::GridFs::Fs::File:0x981vj5ry>
更新 2:
已将 field :image_id, type: String
更改为 field :image_id, type: BSON::ObjectId
结果没有变化。
如果您在 GridFS 中保存图像数据,则需要在您的应用程序中有一个端点以从 GridFS 检索该图像数据并将其提供给应用程序。有关如何提供图像数据的信息,请参阅此答案:Rails - How to send an image from a controller
然后,link 到此端点而不是 linking 到 "f.filename",正如您在上一个代码片段中指出的那样。
经过大量研究,您似乎可以将从 grid_fs
返回的数据编码为 base64。
反过来,您可以通过将源指定为 data:image/png;base64,+base64Image
来使用它来显示图像,如下所示:
field :asset_thumbnail do
formatted_value do
grid_fs = Mongoid::GridFs
f = grid_fs.get(bindings[:object].thumb_image_id)
b64 = Base64.strict_encode64(f.data)
bindings[:view].tag(:img, { :src => "data:image/png;base64,"+b64})
end
end