我使用python requests库的Session功能从远程服务器请求动态生成的图像并将它们写入文件。远程服务器通常不可靠,并将使用html文档或图像片段进行响应。验证内容确实是正确格式(不是html)并且已完全加载的最佳方法是什么? (我的格式是png和csv)我的代码示例如下:
import requests
ses = requests.Session()
data = ses.get("http://url")
localDest = os.path.join("local/file/path")
with open(localDest,'wb') as f:
for chunk in data.iter_content()
f.write(chunk)
我如何修改此代码以检查它是否是正确的格式,并且是一个完整的文件?
答案 0 :(得分:1)
您有两种选择:
如果服务器在有关内容的标题中提供了正确的信息,请检查是否存在无效的内容类型或无效的内容长度。
如果服务器对内容类型撒谎或将内容长度设置为不完整图像的大小,请在之后验证内容。
以下两者:
import imghdr
import os
import os.path
import requests
import shutil
ses = requests.Session()
r = ses.get("http://url", stream=True)
localDest = os.path.join("local/file/path")
if r.status_code == 200:
ctype = r.headers.get('content-type', '')
if ctype.partition('/')[0].lower() != 'image':
raise ValueError('Not served an image')
clength = r.headers.get('content-length')
clength = clength and int(clength)
with open(localDest, 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
if clength and os.path.getsize(localDest) != clength:
os.remove(localDest)
raise ValueError('Served incomplete response')
image_type = imghdr.test(localDest)
if image_type is None:
os.remove(localDest)
raise ValueError('Not served an image')
您还可以安装Pillow并进一步验证图片。