init
This commit is contained in:
47
image/image_precheck.py
Normal file
47
image/image_precheck.py
Normal file
@@ -0,0 +1,47 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
图片预检 - 下载后检查尺寸/格式/是否损坏,不合格直接拒单
|
||||
"""
|
||||
import os
|
||||
import logging
|
||||
from typing import Tuple
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 可配置
|
||||
MIN_WIDTH = int(os.getenv("IMAGE_PRECHECK_MIN_WIDTH", "50"))
|
||||
MIN_HEIGHT = int(os.getenv("IMAGE_PRECHECK_MIN_HEIGHT", "50"))
|
||||
MAX_WIDTH = int(os.getenv("IMAGE_PRECHECK_MAX_WIDTH", "8000"))
|
||||
MAX_HEIGHT = int(os.getenv("IMAGE_PRECHECK_MAX_HEIGHT", "8000"))
|
||||
MIN_SIZE = int(os.getenv("IMAGE_PRECHECK_MIN_BYTES", "100")) # 至少 100 字节
|
||||
MAX_SIZE = int(os.getenv("IMAGE_PRECHECK_MAX_BYTES", "0")) # 0=不限制
|
||||
SUPPORTED_FORMATS = (".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp")
|
||||
|
||||
|
||||
def precheck(local_path: str) -> Tuple[bool, str]:
|
||||
"""
|
||||
预检图片文件。
|
||||
|
||||
Returns:
|
||||
(ok, message) - ok=False 时 message 为拒单原因
|
||||
"""
|
||||
if not os.path.exists(local_path):
|
||||
return False, "图片文件不存在"
|
||||
size = os.path.getsize(local_path)
|
||||
if size < MIN_SIZE:
|
||||
return False, f"图片太小({size} 字节),可能损坏或格式异常"
|
||||
if MAX_SIZE > 0 and size > MAX_SIZE:
|
||||
return False, f"图片过大({size/1024/1024:.1f}MB),超过 {MAX_SIZE/1024/1024:.0f}MB 限制"
|
||||
|
||||
try:
|
||||
from PIL import Image
|
||||
with Image.open(local_path) as img:
|
||||
w, h = img.size
|
||||
if w < MIN_WIDTH or h < MIN_HEIGHT:
|
||||
return False, f"图片尺寸过小({w}x{h}),最小 {MIN_WIDTH}x{MIN_HEIGHT}"
|
||||
if w > MAX_WIDTH or h > MAX_HEIGHT:
|
||||
return False, f"图片尺寸过大({w}x{h}),最大 {MAX_WIDTH}x{MAX_HEIGHT}"
|
||||
img.verify()
|
||||
except Exception as e:
|
||||
return False, f"图片无法读取或已损坏:{str(e)[:50]}"
|
||||
return True, ""
|
||||
Reference in New Issue
Block a user