2012-05-11 22 views

答えて

10

これは迅速である一つの方法です:

それは本当にそれだけのファイル拡張子に基づいて、その後、URLが存在することを確認推測、それが実際に画像ファイルであるかどうかを検証しません。実際にURLから返されたデータが実際にイメージ(セキュリティ上の理由から)であることを確認する必要がある場合は、この解決法は機能しません。

import mimetypes, urllib2 

def is_url_image(url):  
    mimetype,encoding = mimetypes.guess_type(url) 
    return (mimetype and mimetype.startswith('image')) 

def check_url(url): 
    """Returns True if the url returns a response code between 200-300, 
     otherwise return False. 
    """ 
    try: 
     headers={ 
      "Range": "bytes=0-10", 
      "User-Agent": "MyTestAgent", 
      "Accept":"*/*" 
     } 

     req = urllib2.Request(url, headers=headers) 
     response = urllib2.urlopen(req) 
     return response.code in range(200, 209) 
    except Exception, ex: 
     return False 

def is_image_and_ready(url): 
    return is_url_image(url) and check_url(url) 
+1

HEADリクエストは、おそらくあまりにも、行うことができます。 – 9000

+1

ヘッドリクエストが何であるとしても、 'HEAD'リクエストに応答するよりも' Range'ヘッダをサポートするサイト/サーバが増えています。 – MattoTodd

+0

好奇心。範囲 '0-10'は任意ですか?たとえば、「0-0」をリクエストできますか?そうすることが有効であると思われます:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.1 – zigg

1

ここimghdr

に見てみましょういくつかのサンプルコードです:

import imghdr 
import httplib 
import cStringIO 

conn = httplib.HTTPConnection('www.ovguide.com', timeout=60) 
path = '/img/global/ovg_logo.png' 
conn.request('GET', path) 
r1 = conn.getresponse() 

image_file_obj = cStringIO.StringIO(r1.read()) 
what_type = imghdr.what(image_file_obj) 

print what_type 

これは 'PNG' を返す必要があります。それがイメージされていない場合、それは助けなし

希望を返さないでしょう!

-Blake

+0

を解決し、これは移動するための方法であるが、それは最初に全体のイメージファイルを取得する費用で来ます – MattoTodd

0

あなたは、httpリクエストのヘッダーを読み取ることができ、それは、コンテンツ型のようないくつかのメタデータが含まれています。 python 3オン

from urllib.request import urlopen 
image_formats = ("image/png", "image/jpeg", "image/gif") 
url = "http://localhost/img.png" 
site = urlopen(url) 
meta = site.info() # get header of the http request 
if meta["content-type"] in image_formats: # check if the content-type is a image 
    print("it is an image") 

また、この程度の良いニュースは、それが画像をダウンロードしないことです画像のサイズやなどのような他の情報を取得することができます。ヘッダーに画像であると表示されていない場合は失敗する可能性がありますが、最後のチェックを行い、最初のフィルターを通過すると画像をダウンロードできます。

0

これは、以前のコメントにも基づいて、自分のアプリケーションのために働いて最善のアプローチです:

def is_url_image(image_url): 
    image_formats = ("image/png", "image/jpeg", "image/jpg") 
    r = requests.head(image_url) 
    if r.headers["content-type"] in image_formats: 
     return True 
    return False 
関連する問題