我需要将远程图像(例如http://example.com/image.jpg
)复制到我的服务器。这可能吗?
你如何验证这确实是一个图像?
我需要将远程图像(例如http://example.com/image.jpg
)复制到我的服务器。这可能吗?
你如何验证这确实是一个图像?
去下载:
import urllib2
img = urllib2.urlopen("http://example.com/image.jpg").read()
验证可以使用PIL
import StringIO
from PIL import Image
try:
im = Image.open(StringIO.StringIO(img))
im.verify()
except Exception, e:
# The image is not valid
如果您只想验证这是一个图像,即使图像数据无效:您可以使用imghdr
import imghdr
imghdr.what('ignore', img)
该方法检查标题并确定图像类型。如果图像无法识别,它将返回 None。
下载东西
import urllib
url = "http://example.com/image.jpg"
fname = "image.jpg"
urllib.urlretrieve( url, fname )
可以通过多种方式验证它是否为图像。最难的检查是使用 Python 图像库打开文件并查看它是否引发错误。
如果您想在下载前检查文件类型,请查看远程服务器提供的 mime-type。
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() )
同样的事情使用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
对于与复制远程图像有关的问题部分,这是受此答案启发的答案:
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)
请注意,此方法适用于复制任何二进制媒体类型的远程文件。