Python压缩PDF为Zip上传Azure Blob后解压出现多余Zip文件问题
问题分析与解决方案
可能的成因
- 本地Zip文件验证缺失:你没有确认本地生成的Zip文件内容是否正常,若本地Zip本身就包含Zip副本,说明创建逻辑存在问题;若本地正常,则问题出在Azure Blob的上传/下载环节。
item_name变量命名问题:如果item_name包含.zip后缀,会导致Zip内的PDF文件名形如xxx.zip.pdf,容易被误判为Zip文件副本。- 解压操作误判:解压时可能将原Zip文件与解压出的PDF文件放在同一目录,误把原Zip当成了解压产物。
- 本地文件操作冗余:代码中先创建本地PDF再删除的步骤,可能因磁盘缓存或权限问题导致意外文件残留,干扰Zip生成。
解决方案
1. 先验证本地Zip内容
在上传前添加代码,解压本地生成的Zip并检查内容:
import zipfile # 创建Zip后,添加验证步骤 with zipfile.ZipFile(f"{item_name}.zip", 'r') as zip_ref: file_list = zip_ref.namelist() print(f"Zip内文件列表: {file_list}") # 确认只有预期的PDF文件 if len(file_list) != 1 or not file_list[0].endswith('.pdf'): print("Zip文件内容异常,终止上传") os.remove(f"{item_name}.zip") continue
2. 优化Zip生成逻辑(推荐)
跳过本地文件创建,直接在内存中生成Zip并上传,彻底避免本地文件操作的潜在问题:
from io import BytesIO # 省略请求部分 if new_response.status_code == 200: print("got url response") try: # 内存中生成Zip zip_buffer = BytesIO() with zipfile.ZipFile(zip_buffer, 'w') as zip_file: zip_file.writestr(f"{item_name}.pdf", new_response.content) zip_buffer.seek(0) # 重置指针到文件开头 # 上传内存中的Zip到Blob container_client.upload_blob(name=f"{item_name}/{item_name}.zip", data=zip_buffer) print("upload successful") uploaded_items += 1 # 上传metadata(修正缩进,确保在try块内) container_client.upload_blob(name=f"{item_name}/{item_name} metadata", data=json.dumps(result)) except Exception as e: print('There was an error uploading the file: ') print(e) missed_items += 1 continue
3. 检查item_name变量
添加打印语句确认item_name的值,避免包含特殊后缀:
print(f"当前处理的item_name: {item_name}") # 确保item_name不包含.zip后缀 if '.zip' in item_name: item_name = item_name.replace('.zip', '')
4. 验证Azure Blob内容
登录Azure Portal,进入目标存储容器,查看{item_name}目录下的Blob:
- 确认只有
{item_name}.zip和{item_name} metadata两个文件 - 手动下载
{item_name}.zip并解压,验证内容是否正常
内容的提问来源于stack exchange,提问作者dpreese
相关产品推荐
相关产品推荐

