6

リモート URL が画像かどうかを判断しようとしています。ほとんどの URL には .jpg、.png などがありますが、Google 画像などの一部の画像には拡張子がありません...

https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSbK2NSUILnFozlX-oCWQ0r2PS2gHPPF7c8XaxGuJFGe83KGJkhFtlLXU_u

FastImage を使用して、URL が画像かどうかを判断しようとしました。URLがフィードされたときに機能します...

リモート URL が FastImage を使用し、アップロードされたファイルがホワイトリストを使用するようにするにはどうすればよいですか? これが私のアップローダーにあるものです。Avatar_remote_url が認識されない...通常のファイルではなくリモート URL をテストするには、アップローダーで何をすればよいですか。

  def extension_white_list
    if defined? avatar_remote_url && !FastImage.type(CGI::unescape(avatar_remote_url)).nil?
      # ok to process
    else # regular uploaded file should detect the following extensions
      %w(jpg jpeg gif png)
    end
  end
4

3 に答える 3

3

操作する必要があるのがそのような URL だけの場合は、サーバーに HEAD リクエストを送信して、画像のコンテンツ タイプを取得できます。そこから拡張機能を取得できます

require 'net/http'
require 'mime/types'

def get_extension(url)
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true if uri.scheme == 'https'
  request = Net::HTTP::Head.new(uri.request_uri)
  response = http.request(request)
  content_type = response['Content-Type']
  MIME::Types[content_type].first.extensions.first
end
于 2013-04-11T13:57:25.840 に答える
2

あなたが提供したコードと、リモート URL を検証するために CarrierWave Wiki で提供されているコードの一部を使用しています。

で新しいバリデータを作成できますlib/remote_image_validator.rb

require 'fastimage'

class RemoteImageValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    raise(ArgumentError, "A regular expression must be supplied as the :format option of the options hash") unless options[:format].nil? || options[:format].is_a?(Regexp)
    configuration = { :message => "is invalid or not responding", :format => URI::regexp(%w(http https)) }
    configuration.update(options)

    if value =~ configuration[:format]
      begin
        if FastImage.type(CGI::unescape(avatar_remote_url))
          true
        else
          object.errors.add(attribute, configuration[:message]) and false
        end
      rescue
        object.errors.add(attribute, configuration[:message]) and false
      end
    else
      object.errors.add(attribute, configuration[:message]) and false
    end
  end
end

次に、モデルで

class User < ActiveRecord::Base
  validates :avatar_remote_url,
    :remote_image => { 
      :format => /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix,
      :unless => remote_avatar_url.blank?
    }
end
于 2013-04-17T04:15:15.867 に答える
1

拡張子が見つからないために ImageMagick が使用する正しいエンコーダーを特定できなかったため、元のバージョンとは異なるバージョンの作成が失敗するという同様の問題がありました。これは私がRailsに適用したモンキーパッチで、私の問題を解決しました:

module CarrierWave
  module Uploader
    module Download
      class RemoteFile
        def original_filename
          value = File.basename(file.base_uri.path)
          mime_type = Mime::Type.lookup(file.content_type)
          unless File.extname(value).present? || mime_type.blank?
            value = "#{value}.#{mime_type.symbol}"
          end
          value
        end
      end
    end
  end
end

コンテンツ タイプが適切に設定されている場合にファイル拡張子が存在することが保証されるため、これにより問題が解決されると思います。

アップデート:

Carrierwave のマスター ブランチには、Content-Dispositionヘッダーを使用してファイル名を特定するという、この問題に対する別の解決策があります。関連するgithubのプル リクエストは次のとおりです。

于 2013-10-15T14:42:56.510 に答える