You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Flask应用PIL.UnidentifiedImageError问题求助

PIL.UnidentifiedImageError: 无法识别Google Drive图片文件

我开发了一个Python Flask应用,会调用外部.py文件中的函数处理Google Drive上的图片,近期在list_face_encodings函数中突然出现以下错误:

PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x000001FDE90AA750>

错误触发在代码的image_data = Image.open(io.BytesIO(response.content))语句。此前代码运行正常,我已经尝试更新Pillow到最新版本,也查阅过相关平台的同类问题解决方案,但问题仍未解决。

相关代码如下:

import cv2
from PIL import Image
from io import BytesIO
import requests
import numpy as np
import io


class processimage:
    def create_parent_folder(drive_service, parent_folder_name):
        # Check if the parent folder exists
        query = f"mimeType='application/vnd.google-apps.folder' and name='{parent_folder_name}'"
        results = drive_service.files().list(q=query).execute().get("files", [])

        if results:
            # Parent folder already exists, return its ID
            parent_folder_id = results[0]["id"]
        else:
            # Parent folder does not exist, create it
            parent_folder_metadata = {
                "name": parent_folder_name,
                "mimeType": "application/vnd.google-apps.folder",
            }
            parent_folder = (
                drive_service.files()
                .create(body=parent_folder_metadata, fields="id")
                .execute()
            )
            parent_folder_id = parent_folder["id"]

        return parent_folder_id

    def create_folder(drive_service, folder_name, parent_folder=None):
        folder_metadata = {
            "name": folder_name,
            "mimeType": "application/vnd.google-apps.folder",
        }

        if parent_folder:
            # If parent_folder is provided, set it as the parent
            folder_metadata["parents"] = [parent_folder]

        folder = (
            drive_service.files().create(body=folder_metadata, fields="id").execute()
        )

        # Replace with the ID of the file you want to share
        permission_metadata = {
            "type": "anyone",
            "role": "reader",
        }

        # Add the permission to the folder
        drive_service.permissions().create(
            fileId=folder["id"], body=permission_metadata
        ).execute()

        return folder["id"]


    def list_files_in_folder(drive_service, source_folder_id):
        # List files in the source folder
        results = (
            drive_service.files()
            .list(
                q=f"'{source_folder_id}' in parents and trashed=false",
                fields="files(id, name)",
            )
            .execute()
        )
        files = results.get("files", [])
        return files

    def find_face_encodings(image_path):
        image_path = processimage.preprocess_image(image_path)
        face_locations = face_recognition.face_locations(image_path)
        face_encodings = face_recognition.face_encodings(image_path, face_locations)

        if not face_encodings:
            return None
        else:
            return face_encodings

    def preprocess_image(image):
        image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        image_rgb = cv2.resize(image_rgb, (0, 0), fx=0.5, fy=0.5)
        return image_rgb

    def list_face_encoding(files):
        known_faces = []
        print("filess", files)
        for file in files:
            image_2_url = "https:....." + str(file["id"])
            response = requests.get(image_2_url)
            if response.status_code == 200:
                image_data = Image.open(io.BytesIO(response.content))
                image_p = np.array(image_data)
                image_p = cv2.cvtColor(
                    image_p, cv2.COLOR_RGB2BGR
                )  # Convert to BGR format
                image_2 = processimage.find_face_encodings(image_p)
                print("response done")
            else:
                print("########", response.status_code)
                print("###############", response.text)

            i = 0
            while image_2 is None:
                image_p = cv2.rotate(image_p, cv2.ROTATE_90_CLOCKWISE)
                image_2 = processimage.find_face_encodings(image_p)
                i += 1
                print(f"Changing orientation.")
                if i == 4:
                    print("No face found")
                    break
            known_faces.append(image_2)
        return known_faces

    def face_to_be_checked(image_1):
        image_1 = cv2.imread(image_1)

        image_1 = processimage.find_face_encodings(image_1)
        # print("image_1 at package",image_1)
        n = 0
        while image_1 is None:
            image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
            image_1 = processimage.find_face_encodings(image)
            print("No face found in the reference image.", n)
            n += 1  # photo is not not detected in the input
            if n == 4:
                print("no face found,check image")
                break
        return image_1

排查修复方案

  • 修正Google Drive图片链接格式
    直接拼接ID的链接可能返回HTML预览页而非图片文件,替换为正确的图片下载格式:

    image_2_url = f"https://drive.google.com/uc?export=view&id={file['id']}"
    

    同时添加内容类型校验,确认返回的是图片:

    if response.status_code == 200:
        content_type = response.headers.get('Content-Type', '')
        if not content_type.startswith('image/'):
            print(f"文件{file['name']}({file['id']})非图片类型: {content_type}")
            continue
    
  • 添加异常捕获与容错处理
    在打开图片的代码块外包裹try-except,避免单个错误中断整个流程:

    try:
        image_data = Image.open(io.BytesIO(response.content))
        # 后续图片处理逻辑
    except PIL.UnidentifiedImageError:
        print(f"无法识别图片{file['id']},跳过该文件")
        continue
    
  • 检查文件权限与状态
    手动访问拼接后的链接,确认文件是否能正常打开、是否被删除或权限变更。即使文件夹设置了公开可读,单个文件的权限可能被单独修改。

  • 强制刷新请求缓存
    添加请求头避免requests缓存旧的无效响应:

    headers = {'Cache-Control': 'no-cache', 'Pragma': 'no-cache'}
    response = requests.get(image_2_url, headers=headers)
    

内容的提问来源于stack exchange,提问作者cofimonk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:22:03