无法使用获取临时映像文件的文件扩展名Image.open打开(请求。获取())

2024-04-19 09:17:34 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我在这里问的第一个问题,请原谅我缺乏经验:-)

我有以下文件用于保存图像,然后将文件路径/URL返回给我:

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.show()
    i.save(picture_path)

    return picture_fn

我得到以下错误

raisevalueerror(“未知文件扩展名:{}.format(ext))

google_url参数是从googleplacesapi获取图像的api URL。下面当我调用i.show()时,图像会打开,这样我就知道图像正在通过,并且我可以看到在大多数情况下(虽然不一定全部)它会返回一个PNG或JPEG文件。我认为问题是我实际上没有从i获得任何文件名,我假设这是因为它是一个tempfile。你知道吗

任何帮助都将不胜感激,我是Python的新手。你知道吗


Tags: 文件pathfrom图像importurlosgoogle
3条回答

好吧,我想了个解决办法。如果别人有更好的解决办法,我洗耳恭听。你知道吗

基本上,问题是当我使用i.format获取文件扩展名类型时,“.PNG”中没有包含“.”。所以文件名类似于“filenamepng”,而不是“filenamepng”文件名.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

这是一个猜测,因为我没有一个googleplaces帐户,但是:通常,HTTP响应将声明它们在content-type头中包含的数据类型。你知道吗

标头的值可能如下所示

"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

根据PILdocumentation,格式字符串在某些情况下可能是None。(如果你能发布一个完整的例子,我可以在笔记本上运行和玩,如果我使用一个随机的图像URL,它基本上是工作的,这将是很有帮助的。)

提供一个默认格式(.jpg?) f_ext=(i.format).lower(),如果i.format不是None-else'.jpg' 对于那些案子,但这里有点猜测。。。你知道吗

相关问题 更多 >