如何在不写入文件的情况下找出 MIME 类型?

How do I figure out the mime type without writing a file?

这是 Rails 5 和 ruby-filemagic。目前,除了其 mime 类型外,我还将上传的图像保存到我的数据库中。我的控制器中有这段代码

  def create
    @person = Person.new(person_params)
    if @person.image
      cur_time_in_ms = DateTime.now.strftime('%Q')
      file_location = "/tmp/file#{cur_time_in_ms}.ext"
      File.binwrite(file_location, @person.image.read)
      fm = FileMagic.new(FileMagic::MAGIC_MIME)
      @person.content_type = fm.file(file_location, true)
    end
    if @person.save
      redirect_to @person
    else
      # This line overrides the default rendering behavior, which
      # would have been to render the "create" view.
      render "new"
    end
  end

使用这种方法困扰我的是,我必须先将文件写入文件系统,然后才能确定其 mime 类型。那似乎很浪费。如何在不先创建文件的情况下找出 mime 类型?

编辑: 根据给出的答案,我重新排列了一些东西,但现在 "content_type" 变成了 "application/x-empty" 即使我上传了一个有效的 png 文件.这是代码

if @person.image

  cur_time_in_ms = DateTime.now.strftime('%Q')
  file_location = "/tmp/file#{cur_time_in_ms}.ext"
  File.binwrite(file_location, @person.image.read)
  file = File.open(file_location, "rb")
  contents = file.read
  # Scale image appropriately
  #img = Magick::Image::read(file_location).first
  @person.content_type = FileMagic.new(FileMagic::MAGIC_MIME).buffer(@person.image.read, true)
  @person.image = contents

尝试使用 buffer 方法而不是文件,即 FileMagic.new(FileMagic::MAGIC_MIME).buffer(@person.image.read, true)

假设你是通过html形式上传文件,IO对象应该已经有mime类型,你可以这样得到:

mime = params[:file].content_type