如何在没有扩展的情况下检测图像扩展?

时间:2013-05-22 10:34:47

标签: ruby-on-rails ruby imagemagick carrierwave rmagick

我的情况: 我有基于RubyOnRails的应用程序。 我使用Carrierwave进行图像上传。

我有很多文件保存没有扩展错误。 因此,所有这些都具有带空值的content_type

有没有办法恢复这些图片的扩展名?

由于

3 个答案:

答案 0 :(得分:1)

您可能需要从文件签名中推断出来:http://en.wikipedia.org/wiki/List_of_file_signatures

答案 1 :(得分:1)

您可以尝试使用unix命令file来尝试检测MIME类型。例如:

$ file -bi i_am_a_png
image/png; charset=binary

这会尝试通过它的签名(二进制结构)来确定文件类型。

您可以运行这样的bash脚本来推断文件扩展名并相应地重命名文件:

#!/bin/bash

IFS=$"\n"
for f in *
do
  mime=`file -bi $f`
  if [ $? == 0 ]
  then
      ext=( $(echo $mime | awk -F ";" '{ gsub(".*/", ""); print $1}') )
      cmd="mv $f $f.$ext"

      echo $cmd
      # `$cmd`    # Uncomment when you're happy with the command output
  else
      echo "Could not detect file type"
  fi
done

它只是遍历当前目录中的文件,运行file -bi并抓取可以传递扩展名的字符串部分(“image / png”中的“png”)。然后,它使用扩展名重命名该文件。默认情况下,它只是打印出命令,因此如果你感到满意,那就取消注意它正在做正确的事情。

答案 2 :(得分:1)

您也可以尝试

require 'RMagick'
puts Magick::Image::read(filename).first.format

以下是文档的link