Flask使用Pillow保存用户上传图片遇KeyError问题求助
问题分析与解决
错误原因
你遇到的KeyError: '1.JPG'是因为调用Image.save()时参数传递错误:
- 原代码里
os.path.join("../static/upload")只生成了目录路径,没把文件名拼接进去,导致save()方法把第二个参数filename(也就是1.JPG)当成了图片格式参数。 - 但
'1.JPG'并不是Pillow认可的格式标识符(合法格式比如'JPEG'、'PNG'),所以触发了KeyError。
修正步骤
- 正确拼接文件路径:把目录和文件名用
os.path.join合并成完整的文件路径,作为save()的第一个参数。 - 确保目标目录存在:如果
../static/upload目录不存在,保存操作会失败,所以要先检查并创建目录。
修正后的代码
import os from PIL import Image def upload_photo(post_image, filename): # 定义保存目录 save_dir = "../static/upload" # 确保目录存在,不存在则递归创建 os.makedirs(save_dir, exist_ok=True) # 拼接完整的文件保存路径 save_path = os.path.join(save_dir, filename) with Image.open(post_image) as new_image: image = new_image.resize((600, 500), Image.ANTIALIAS) image.save(save_path)
额外建议
在Flask中用相对路径容易出问题,建议基于应用根目录生成绝对路径,比如:
# 假设app是你的Flask应用实例 save_dir = os.path.join(app.root_path, "static", "upload")
这样不管脚本在哪个位置运行,路径都能正确指向项目的static/upload目录。
内容的提问来源于stack exchange,提问作者Pourya Mohamadi
相关产品推荐
相关产品推荐

