3 回答

TA贡献1906条经验 获得超10个赞
这是一个猜测,因为我没有 Google Places 帐户,但是:通常,HTTP 响应将声明它们包含在内容类型标头中的数据类型。
标头的值可能如下所示
"image/jpeg"
或这个
"image/jpeg; charset=UTF-8"
标准库中的mimetypes模块包含从该标头值派生扩展的工具。所以你可以做这样的事情:
import mimetypes
import requests
def save_picture(google_url):
response = requests.get(google_url, stream=True)
content_type = response.headers['content-type'] # 'image/jpeg; charset=UTF-8'
mimetype, _, _ = content_type.partition(';') # 'image/jpeg'
f_ext = mimetypes.guess_extension(mimetype) # '.jpg'
random_hex = secrets.token_hex(8)
i = Image.open(response.raw)
picture_fn = random_hex + f_ext
picture_path = os.path.join(current_app.root_path, 'static/experience_images', picture_fn)
output_size = (600, 600)
i.thumbnail(output_size)
i.show()
i.save(picture_path)
return picture_fn

TA贡献1853条经验 获得超9个赞
好的,所以我想出了一个解决方案。如果其他人有更好的解决方案,我会全力以赴。
基本上,问题似乎是当我使用i.format它获取文件扩展名类型时不包含“。” 在“.PNG”中。所以文件名类似于“filenamepng”而不是“filename.png”。
所以现在在获得文件扩展名之后
f_ext = i.format
我创建文件名
picture_fn = random_hex + '.' + f_ext
现在一切似乎都正常了 :-) 感谢 DrD,我在整理一个示例代码片段供您试用时发现了这一点。
现在完成的代码如下:
import os, requests
import secrets
from PIL import Image
from flask import url_for, current_app
def save_picture(google_url):
random_hex = secrets.token_hex(8)
i = Image.open(requests.get(google_url, stream=True).raw)
f_ext = (i.format).lower()
picture_fn = random_hex + '.' + f_ext
picture_path = os.path.join(current_app.root_path, 'static/experience_images', picture_fn)
output_size = (600, 600)
i.thumbnail(output_size)
i.save(picture_path)
return picture_fn
添加回答
举报