【问题标题】:How to display image returned from Mongoid::GridFs如何显示从 Mongoid::GridFs 返回的图像
【发布时间】:2020-01-19 02:57:06
【问题描述】:

我正在尝试使用 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

不幸的是,这并没有改变任何东西。尝试在新选项卡中打开图像会将我带到以下链接:/admin/asset#<Mongoid::GridFs::Fs::File:0x981vj5ry>

更新 2:

field :image_id, type: String 更改为field :image_id, type: BSON::ObjectId

结果没有变化。

【问题讨论】:

    标签: ruby-on-rails mongoid gridfs rails-admin


    【解决方案1】:

    经过大量研究,您似乎可以将从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 
    

    【讨论】:

      【解决方案2】:

      如果您要在 GridFS 中保存图像数据,则需要在应用程序中有一个端点,以从 GridFS 检索该图像数据并将其提供给应用程序。有关如何提供图像数据的信息,请参阅此答案:Rails - How to send an image from a controller

      然后,链接到此端点,而不是链接到“f.filename”,如您在最后一个代码 sn-p 中指出的那样。

      【讨论】:

      • 感谢您抽出宝贵时间回答。我只是想知道 - 有没有办法显示图像而不必在本地保存文件?理想情况下,我会从 GridFs 中提取图像数据:f = grid_fs.get(bindings[:object].image_id) file = File.new(bindings[:object].data_file_name, 'wb') f.each { |chunk| file.write(chunk) } 然后以某种方式显示file
      • 您不需要将数据从 GridFS 复制到本地文件系统来提供服务,但您仍然需要一个端点来从 GridFS 检索数据,然后将其转发到浏览器。
      猜你喜欢
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 2014-04-08
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      相关资源
      最近更新 更多