如何调整图片大小并通过save函数保存至存储?如何修改save函数解决上传报错?
问题1:调整图片大小并通过save函数保存到存储
步骤与代码示例
假设使用Python的Pillow库处理图片,结合自定义存储服务的save函数:
- 先安装依赖:
pip install pillow
- 图片尺寸调整与保存逻辑:
from PIL import Image import io def resize_and_save_image(image_file, target_size=(800, 600), storage_service=None): # 打开图片文件 with Image.open(image_file) as img: # 保持宽高比调整尺寸(若需强制固定尺寸,直接替换为img.resize(target_size)) img.thumbnail(target_size) # 将调整后的图片转为字节流 buffer = io.BytesIO() # 保留原图片格式,无格式时默认用JPEG img_format = image_file.name.split('.')[-1].upper() if '.' in image_file.name else 'JPEG' img.save(buffer, format=img_format) buffer.seek(0) # 调用存储服务的save函数完成保存 if storage_service: # 假设存储服务的save方法接收文件名和字节流参数 return storage_service.save(f"resized_{image_file.name}", buffer)
问题2:修改save函数解决上传报错
常见报错场景及对应修改方案
结合图片上传的高频问题,给save函数添加格式校验、大小限制、路径处理和异常捕获逻辑:
import os import io def save(self, name, content, max_size=5*1024*1024): # 1. 校验图片格式 allowed_formats = {'JPEG', 'PNG', 'GIF', 'WEBP'} file_format = content.name.split('.')[-1].upper() if '.' in content.name else '' if file_format not in allowed_formats: raise ValueError("仅支持JPEG/PNG/GIF/WEBP格式的图片") # 2. 校验文件大小 content.seek(0, io.SEEK_END) file_size = content.tell() content.seek(0) if file_size > max_size: raise ValueError(f"图片大小不能超过{max_size//1024//1024}MB") # 3. 处理重复文件名,避免覆盖 base_name, ext = os.path.splitext(name) counter = 1 while self.exists(name): name = f"{base_name}_{counter}{ext}" counter += 1 # 4. 捕获存储过程中的异常,明确报错信息 try: # 执行原存储逻辑(如写入本地路径/云存储桶) return super().save(name, content) except Exception as e: raise RuntimeError(f"图片上传失败: {str(e)}") from e
额外说明
- 若使用框架自带存储服务(如Django的FileSystemStorage),可通过继承原存储类并重写save方法实现上述逻辑
- 若报错源于权限问题,需确认存储路径/云存储桶的写入权限;若为网络波动,可在try块中添加重试机制
内容的提问来源于stack exchange,提问作者Pouria sh
相关产品推荐
相关产品推荐

