Django中使用pyminizip压缩文件返回响应时报参数错误如何解决?
pyminizip压缩报错问题排查及解决方法
错误原因
触发ValueError的核心原因是pyminizip.compress方法的第三个参数类型不匹配:该参数要求传入输出ZIP文件的本地路径字符串,你当前直接传入了Django的HttpResponse对象,不符合方法参数要求。
pyminizip.compress方法的参数规范如下:
- srcfile:待压缩的源文件本地路径(字符串)
- prefix:压缩包内的文件路径前缀(字符串,传空值则源文件直接放在压缩包根目录)
- zipfile:输出的ZIP文件本地路径(字符串,不支持传入文件对象、响应对象等非路径类型)
- password:压缩包密码(字符串,无密码则传
None)- compress_level:压缩级别(整数,取值范围0-9,1为最快压缩,9为最高压缩比)
解决步骤
pyminizip暂不支持直接写入内存对象,需要先将压缩结果写入本地临时文件,再读取文件内容写入响应,最后清理临时文件即可,完整修正代码如下:
import os import tempfile import csv import pyminizip from django.http import HttpResponse from .models import User def get_csv_file(request): # 1. 生成CSV临时文件 users = User.objects.all() csv_temp_path = os.path.join(tempfile.gettempdir(), 'member.csv') # 明确指定编码、newline参数避免乱码和多余空行 with open(csv_temp_path, 'w', encoding='utf-8', newline='') as f: file_writer = csv.writer(f, quotechar='"', quoting=csv.QUOTE_MINIMAL) # 可选:写入表头 file_writer.writerow(['用户名', '邮箱']) for user in users: file_writer.writerow([user.username, user.email]) # 2. 生成ZIP临时文件 zip_temp_path = os.path.join(tempfile.gettempdir(), 'member.zip') # 此处第三个参数传ZIP临时文件路径,第二个参数按需设置压缩包内的路径 pyminizip.compress(csv_temp_path, "", zip_temp_path, "pass", 1) # 3. 构造响应返回压缩文件 response = HttpResponse(content_type='application/zip') response['Content-Disposition'] = 'attachment; filename="member.zip"' with open(zip_temp_path, 'rb') as f: response.write(f.read()) # 4. 清理临时文件,避免磁盘占用 os.remove(csv_temp_path) os.remove(zip_temp_path) return response
内容的提问来源于stack exchange,提问作者Biju
相关产品推荐
相关产品推荐

