Muszę skopiować zdalny obraz (na przykład http://example.com/image.jpg
) na mój serwer. czy to możliwe?Jak skopiować zdalny obraz w pythonie?
Jak sprawdzić, czy to rzeczywiście obraz?
Muszę skopiować zdalny obraz (na przykład http://example.com/image.jpg
) na mój serwer. czy to możliwe?Jak skopiować zdalny obraz w pythonie?
Jak sprawdzić, czy to rzeczywiście obraz?
Do pobrania:
import urllib2
img = urllib2.urlopen("http://example.com/image.jpg").read()
Aby sprawdzić można używać PIL
import StringIO
from PIL import Image
try:
im = Image.open(StringIO.StringIO(img))
im.verify()
except Exception, e:
# The image is not valid
Jeśli chcesz tylko do sprawdzenia jest to obraz nawet jeśli dane obrazu nie jest prawidłowa: Można użyć imghdr
import imghdr
imghdr.what('ignore', img)
Metoda sprawdza nagłówki i określa typ obrazu. Zwróci None, jeśli obraz nie był identyfikowalny.
pobieranie rzeczy
import urllib
url = "http://example.com/image.jpg"
fname = "image.jpg"
urllib.urlretrieve(url, fname)
Sprawdzanie, czy jest to obraz można zrobić na wiele sposobów. Najtrudniejszym sprawdzeniem jest otwarcie pliku za pomocą Biblioteki obrazów Python i sprawdzenie, czy nie zgłasza błędu.
Jeśli chcesz sprawdzić typ pliku przed pobraniem, spójrz na typ MIME, który podaje serwer zdalny.
import urllib
url = "http://example.com/image.jpg"
fname = "image.jpg"
opener = urllib.urlopen(url)
if opener.headers.maintype == 'image':
# you get the idea
open(fname, 'wb').write(opener.read())
samo używając httplib2 ...
from PIL import Image
from StringIO import StringIO
from httplib2 import Http
# retrieve image
http = Http()
request, content = http.request('http://www.server.com/path/to/image.jpg')
im = Image.open(StringIO(content))
# is it valid?
try:
im.verify()
except Exception:
pass # not valid
Dla części pytania w odniesieniu do kopiowania zdalnego obrazu, oto odpowiedź zainspirowany this answer:
import urllib2
import shutil
url = 'http://dummyimage.com/100' # returns a dynamically generated PNG
local_file_name = 'dummy100x100.png'
remote_file = urllib2.urlopen(url)
with open(local_file_name, 'wb') as local_file:
shutil.copyfileobj(remote_file, local_file)
Należy pamiętać, że to podejście będzie działać w przypadku kopiowania zdalnego pliku dowolnego binarnego typu nośnika.