You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中使用pyminizip压缩文件返回响应时报参数错误如何解决?

pyminizip压缩报错问题排查及解决方法

错误原因

触发ValueError的核心原因是pyminizip.compress方法的第三个参数类型不匹配:该参数要求传入输出ZIP文件的本地路径字符串,你当前直接传入了Django的HttpResponse对象,不符合方法参数要求。

pyminizip.compress方法的参数规范如下:

  1. srcfile:待压缩的源文件本地路径(字符串)
  2. prefix:压缩包内的文件路径前缀(字符串,传空值则源文件直接放在压缩包根目录)
  3. zipfile:输出的ZIP文件本地路径(字符串,不支持传入文件对象、响应对象等非路径类型)
  4. password:压缩包密码(字符串,无密码则传None)
  5. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:36:03