Ruby on rails 如何在Rails应用程序中检测文件类型?

Ruby on rails 如何在Rails应用程序中检测文件类型?,ruby-on-rails,ruby,carrierwave,file-type,Ruby On Rails,Ruby,Carrierwave,File Type,我正在使用Carrierwave将图像、文档和视频上传到我的s3存储桶。到目前为止,上传图像和文档还可以 在我的视图中,我想做的是确定文件类型,然后显示图像(目前我可以这样做),或者提供文档的图像,单击该图像将为用户下载/打开该文件的副本 因此,在我看来,要渲染图像,我会这样做 <% document.each do |doc| %> <%= link_to image_tag(doc.media_url(:thumb)) %> <% end %>

我正在使用Carrierwave将图像、文档和视频上传到我的s3存储桶。到目前为止,上传图像和文档还可以

在我的视图中,我想做的是确定文件类型,然后显示图像(目前我可以这样做),或者提供文档的图像,单击该图像将为用户下载/打开该文件的副本

因此,在我看来,要渲染图像,我会这样做

 <% document.each do |doc| %>
   <%= link_to image_tag(doc.media_url(:thumb)) %> 
 <% end %>

但我该怎么说呢

<% document.each do |doc| %>
  <% if doc.file_type == ['jpg', 'jpeg', 'png']
   <%= link_to image_tag(doc.media_url(:thumb)) %>
  <% else %>
    <%= link_to doc.media.path %> # This link downloading the file 
  <% end %>
<% end %>


在linux中,我也相信Mac,有一个实用程序可以确定文件的类型:

$ file filename.jpg
filename: JPEG image data, JFIF standard 1.02
$ file ./шрифты/шрифты/page-0020.png
filename.png: PNG image, 2512 x 3270, 8-bit grayscale, non-interlaced
因此,在
ruby
中,您可以发出
%x()
方法来获取信息:

def type filename
   res = %x(file "#{File.expand_path(filename)}")
   m = res.match(/(.*): (.*)$/).to_a.last.split(' ').first.downcase
end
因此,它将返回:

type "filename.jpg" # => jpeg
type "filename.png" # => png

对于windows,有些人应该使用
mingw
/
cygwin
安装。

在linux中,我也相信Mac,有一个实用程序可以确定文件的类型:

$ file filename.jpg
filename: JPEG image data, JFIF standard 1.02
$ file ./шрифты/шрифты/page-0020.png
filename.png: PNG image, 2512 x 3270, 8-bit grayscale, non-interlaced
因此,在
ruby
中,您可以发出
%x()
方法来获取信息:

def type filename
   res = %x(file "#{File.expand_path(filename)}")
   m = res.match(/(.*): (.*)$/).to_a.last.split(' ').first.downcase
end
因此,它将返回:

type "filename.jpg" # => jpeg
type "filename.png" # => png
对于windows,有些人应该使用
mingw
/
cygwin
安装。

我猜(让其他人猜你应该在问题中提供什么不是一件好事)你有一个模型文档,你的上传器是媒体,类似这样:

class Document < ActiveRecord::Base
  mount_uploader :media, MediaUploader
end
如果您需要,Carrierwave可以通过以下方式为您提供内容类型:

document.media.content_type # this returns image/png for a png file ...
编辑:

我认为更好的方法是这样检查(它更干净):


#此链接用于下载文件
我猜(让其他人猜你应该在问题中提供什么不是一件好事)你有一个模型文档,你的上传器是媒体,类似这样:

class Document < ActiveRecord::Base
  mount_uploader :media, MediaUploader
end
如果您需要,Carrierwave可以通过以下方式为您提供内容类型:

document.media.content_type # this returns image/png for a png file ...
编辑:

我认为更好的方法是这样检查(它更干净):


#此链接用于下载文件

您能否将上传的文件视为文件系统上的文件?抱歉,但您能否进一步解释您能否将上传的文件视为文件系统上的文件?抱歉,但您能否进一步解释啊,谢谢,这更有意义。.下一步允许用户下载文档:)啊,谢谢,这更有意义..下一阶段允许用户下载文档:)