3 回答
TA貢獻1906條經(jīng)驗 獲得超10個贊
這是一個猜測,因為我沒有 Google Places 帳戶,但是:通常,HTTP 響應(yīng)將聲明它們包含在內(nèi)容類型標頭中的數(shù)據(jù)類型。
標頭的值可能如下所示
"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貢獻1890條經(jīng)驗 獲得超9個贊
根據(jù) PIL文檔,格式字符串在某些情況下可能為 None。(如果您發(fā)布一個完整的示例,我可以在筆記本中運行并使用它會很有幫助,如果我使用隨機圖像 URL,它基本上可以工作。)
提供默認格式 (.jpg?) f_ext = (i.format).lower() 如果 i.format 在這些情況下不是 None else '.jpg' 可能就足夠了,但在這里猜測一下......
TA貢獻1853條經(jīng)驗 獲得超9個贊
好的,所以我想出了一個解決方案。如果其他人有更好的解決方案,我會全力以赴。
基本上,問題似乎是當(dāng)我使用i.format它獲取文件擴展名類型時不包含“?!?在“.PNG”中。所以文件名類似于“filenamepng”而不是“filename.png”。
所以現(xiàn)在在獲得文件擴展名之后
f_ext = i.format
我創(chuàng)建文件名
picture_fn = random_hex + '.' + f_ext
現(xiàn)在一切似乎都正常了 :-) 感謝 DrD,我在整理一個示例代碼片段供您試用時發(fā)現(xiàn)了這一點。
現(xiàn)在完成的代碼如下:
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
添加回答
舉報
