使用Paperclip从URL获取图像

时间:2014-03-26 07:38:34

标签: ruby-on-rails ruby-on-rails-3 paperclip uri

我知道这已经被问过了,但是我找不到任何与我面临的问题相似的东西。

我使用open()方法下载并保存文件。

img = Image.new
img.image = open(url)
img.save

这会引发错误:Paperclip error while determining content type 我在SO上发现了这个,但我在Linux机器上,所以它不适用:

paperclip Error while determining content type: Cocaine::CommandNotFoundError in Rails 3.2.1

另一种方法是使用URI.parse()。但是我之前遇到过它的问题,现在似乎工作正常。

总体而言,来自open()URI.parse()的行为无法预测。有时他们工作有时他们没有。在这种情况下最好使用的是什么?我可以使用哪种失败的安全策略?

1 个答案:

答案 0 :(得分:2)

我遇到过某些文件类型的类似问题。我正在使用Ubuntu 12.04并且file --mime并不总是设法找到文件类型,例如使用.doc文件。

我通过修改Paperclip在可能的地方使用file --mime来解决这个问题,然后再回到mimetype

这样的事情:

module Paperclip
  class FileCommandContentTypeDetector
    private

    def type_from_file_command
      # -- original code --
      # type = begin
        # # On BSDs, `file` doesn't give a result code of 1 if the file doesn't exist.
        # Paperclip.run("file", "-b --mime :file", :file => @filename)
      # rescue Cocaine::CommandLineError => e
        # Paperclip.log("Error while determining content type: #{e}")
        # SENSIBLE_DEFAULT
      # end

      # if type.nil? || type.match(/\(.*?\)/)
        # type = SENSIBLE_DEFAULT
      # end
      # type.split(/[:;\s]+/)[0]

      # -- new code --
      type = begin
        Paperclip.run('file', '-b --mime :file', file: @filename)
      rescue Cocaine::CommandLineError
        ''
      end

      if type.blank?
        type = begin
          Paperclip.run('mimetype', '-b :file', file: @filename)
        rescue Cocaine::CommandLineError
          ''
        end
      end

      if type.blank? || type.match(/\(.*?\)/)
        type = SENSIBLE_DEFAULT
      end
      type.split(/[:;\s]+/)[0]
    end
  end
end