AWS Lambda解压S3文件丢失父文件夹问题求助
解决AWS Lambda解压S3 Zip文件时丢失原文件名父文件夹的问题
问题描述
使用AWS Lambda解压S3存储桶内的Zip文件时,解压出的子文件夹直接上传至原Zip文件所在路径,丢失了原Zip文件名作为父文件夹层级。例如原S3文件为OriginalFolder.zip,解压后生成Log.folder而非预期的OriginalFolder/Log.folder,导致多农场触发时文件夹被覆盖,且依赖父文件夹名识别来源的log4j日志解析脚本无法正常工作。不想通过boto3复制重命名,需要更简便的解决方法。
解决方案
核心思路是在构造上传路径时,将原Zip文件的文件名(去除.zip后缀)作为父文件夹层级加入路径,直接在解压上传阶段完成路径构造,无需额外重命名操作。
修改后的代码
import os import tempfile import zipfile from concurrent import futures from io import BytesIO import boto3 s3 = boto3.client('s3') # 全局变量新增zip_folder_name,用于存储原Zip文件名(无后缀) bucket = "" path = "" zipdata = None zip_folder_name = "" def handler(event, context): global bucket, path, zipdata, zip_folder_name action = event.get("action", None) if action == "create" or action == "update": bucket = event['payload']['BucketName'] key = event['payload']['Key'] path = os.path.dirname(key) # 提取原Zip文件名(去除.zip后缀)作为父文件夹名 zip_filename = os.path.basename(key) zip_folder_name = os.path.splitext(zip_filename)[0] # 创建临时文件并下载Zip temp_file = tempfile.mktemp() s3.download_file(bucket, key, temp_file) zipdata = zipfile.ZipFile(temp_file) # 多线程解压上传 with futures.ThreadPoolExecutor(max_workers=4) as executor: future_list = [ executor.submit(extract, filename) for filename in zipdata.namelist() ] result = {'success': [], 'fail': []} for future in future_list: filename, status = future.result() result[status].append(filename) return result def extract(filename): upload_status = 'success' try: # 构造新路径:原路径 + 原Zip文件名(无后缀) + 解压后的文件名 upload_key = os.path.join(path, zip_folder_name, filename) s3.upload_fileobj( BytesIO(zipdata.read(filename)), bucket, upload_key ) except Exception: upload_status = 'fail' finally: return filename, upload_status
关键修改点
- 提取原Zip文件名:在handler函数中,通过
os.path.basename(key)获取原Zip文件名,再用os.path.splitext()去除.zip后缀,得到作为父文件夹的名称。 - 构造上传路径:在
extract函数中,将zip_folder_name加入上传路径,确保所有解压后的文件都放在原路径/原Zip文件名/的层级下。
效果验证
修改后,原S3文件OriginalFolder.zip解压后,会生成OriginalFolder/Log.folder这样的路径结构,既避免了多农场触发时的文件夹覆盖问题,也满足后续log4j日志解析脚本对父文件夹名的依赖。
内容的提问来源于stack exchange,提问作者jrk25
相关产品推荐
相关产品推荐

