2013-04-08 12 views
6

Próbuję ustalić, czy zdalny adres URL jest obrazem. Większość adresów URL ma .jpg, .png itp. ... ale niektóre obrazy, takie jak obrazy Google, nie mają rozszerzenia ... tj.Rozszerzenia obrazu Carrierwave

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

Próbowałem za pomocą FastImage celu ustalenia, czy adres URL jest obraz. Działa, gdy adres URL jest podany do niego ...

W jaki sposób mogę się upewnić, że zdalne adresy URL korzystają z FastImage, a przesłane pliki korzystają z białej listy? Oto, co mam w moim uploaderze. Avatar_remote_url nie jest rozpoznawany ... co zrobić w przesyłającym, aby przetestować zdalne adresy URL, a nie zwykłe pliki.

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 
+0

Możliwe, że można użyć wyrażenia regularnego, aby zezwolić na przesłanie czegokolwiek z http: //encrpyted-tbn0.gstatic – ahmet

Odpowiedz

3

jeśli wszystko trzeba pracować to url tak można wysłać żądanie HEAD do serwera, aby uzyskać typ zawartości dla obrazu. Z których można uzyskać rozszerzenie

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 
2

Pracuję z kodem, który podałeś, a niektóre z kodu przewidzianego w CarrierWave Wiki for validating remote URLs.

Możesz utworzyć nowy weryfikator w 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 

Następnie w modelu

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 
1

miałem podobny problem, tworząc różne wersje z oryginalnego została niepowodzeniem, ponieważ ImageMagick nie mógł dowiedzieć się prawidłową enkoder do korzystania z powodu brakującego rozszerzeniem . Oto małpa-łata Złożyłem w Rails, które stały mój problem:

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 

Wierzę, że to rozwiąże problem, który masz, a także ponieważ gwarantuje istnienie rozszerzenia pliku gdy typ zawartości jest ustawiona odpowiednio .

UPDATE:

Oddział mistrz carrierwave ma innego rozwiązania tego problemu, który używa nagłówka Content-Disposition aby dowiedzieć się nazwę. Oto odpowiednia prośba o przyciągnięcie pod numer github.

+0

To jest świetne! Dlaczego nie wysłałeś prośby do Carrierwave? To jest oczywiście lepsze podejście w dzisiejszych czasach z serwerami obrazów i wszystkim ... –

+0

Byłem właśnie w trakcie przesyłania jednego @NielsKristian :-D – Hamed

+0

Myślę, że będzie witamy https://github.com/carrierwaveuploader/carrierwave/issues/1247 :-) –

Powiązane problemy