Google Cloud Functions Python脚本临时存储处理图片方案咨询
Google Cloud Functions 临时图片存储方案
Google Cloud Functions 运行环境提供内存挂载的可写临时目录/tmp,可直接替代本地的images文件夹完成图片暂存、处理、上传全流程。该目录随函数实例生命周期存在,实例销毁后文件自动清理,完全满足临时存储需求。
具体改造步骤
1. 定义统一临时目录常量
Cloud Functions 仅/tmp目录有写入权限,其余目录均为只读,直接在代码开头定义临时路径,避免硬编码相对路径:
import os TEMP_DIR = "/tmp" # 兼容校验,确保目录存在 os.makedirs(TEMP_DIR, exist_ok=True)
2. 改造图片下载函数
替换原有硬编码的相对路径,使用标准路径拼接方法避免跨环境兼容问题:
import urllib.request def dl_jpg(url, file_path, file_name): full_path = os.path.join(file_path, f"{file_name}.jpg") urllib.request.urlretrieve(url, full_path) return full_path
3. 改造图片优化函数
注意高版本Pillow库已经弃用Image.ANTIALIAS,替换为Image.Resampling.LANCZOS避免运行报错,同时统一使用临时目录路径:
from PIL import Image def optimizeImage(name) -> str: img_path = os.path.join(TEMP_DIR, f"{name}.jpg") foo = Image.open(img_path) foo = foo.resize((525,394), Image.Resampling.LANCZOS) foo.save(img_path, optimize=True, quality=50) print(f'Optimized Image: {name}') return img_path
4. 调整主逻辑的路径传参
原有图片处理循环中,将传入的存储路径从本地的'images/'替换为TEMP_DIR即可,其余URL解析、文件名生成逻辑无需改动:
# 省略原有BeautifulSoup解析图片URL的逻辑 imageFile = [] for image in images: newURL = image[:-4] + 'jpg' print(newURL) name = find_between(newURL, "_img", "/origin.jpg") if name == "": name = random_name() print(name) try: # 替换为临时目录常量 dl_jpg(newURL, TEMP_DIR, name) except: break try: path = optimizeImage(name) except: break imageFile.append(path)
5. 改造Firebase Storage上传逻辑
去掉原有写死索引的路径截取逻辑,用标准路径方法取文件名,上传完成后主动删除临时文件,避免同实例复用时占用内存:
photos = [] bucket = storage.bucket() for image_path in imageFile: filename = os.path.basename(image_path) blob = bucket.blob(f'ListingImages/{ref.id}/{filename}') blob.upload_from_filename(image_path) blob.make_public() photos.append(blob.public_url) # 上传完成主动删除临时文件 os.remove(image_path)
注意事项
/tmp目录的可用空间与函数分配的内存大小一致,例如分配512M内存时,临时目录最多可存储512M文件,常规图片处理场景分配256M~512M内存即可满足需求,若需批量处理大尺寸图片可适当调高内存配置。- 函数实例在冷启动后短时间内被多次触发时会被复用,
/tmp内的残留文件会保留,因此建议上传完成后主动删除临时文件,或生成文件名时增加随机后缀避免重名覆盖。 - 不要在
/tmp之外的路径尝试写入文件,会直接触发权限报错。
内容的提问来源于stack exchange,提问作者Rene Alas
相关产品推荐
相关产品推荐

