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

Zip文件上传解析报错:需bytes-like对象而非list问题求助

解决Zip文件上传解压时的"bytes-like object is required, not 'list'"错误

你的核心问题是把文件列表直接传给了ZipFile——request.FILES.getlist('document[]')返回的是多个上传文件的对象列表,而zipfile.ZipFile需要的是单个文件的字节流或文件对象,类型不匹配导致了报错。

下面是修正后的代码,附带关键改动说明:

import zipfile
from django.shortcuts import render

def your_upload_view(request):
    if request.method == 'POST':
        files = request.FILES.getlist('document[]')
        # 遍历每个上传的Zip文件
        for uploaded_file in files:
            # 直接用Django上传的文件对象创建ZipFile,无需BytesIO包装
            with zipfile.ZipFile(uploaded_file, "r") as archive:
                for zipped_file_name in archive.namelist():
                    # 跳过解压出来的目录,只处理实际文件
                    if zipped_file_name.endswith('/'):
                        continue
                    with archive.open(zipped_file_name) as zipped_file:
                        # 读取文件内容并解码为字符串(如果是二进制文件,去掉.decode('utf-8'))
                        file_content = zipped_file.read().decode('utf-8')
                        # 一步创建并保存记录
                        UploadedFile.objects.create(
                            document=file_content,
                            user=request.user
                        )
        # 所有文件处理完成后再返回页面,不要在循环内return
        return render(request, 'uploader/index.html', {'files': files})
    # GET请求时的逻辑(如果需要)
    return render(request, 'uploader/index.html')

关键改动点:

  1. 遍历文件列表:不再直接把files列表传给ZipFile,而是逐个处理每个上传的Zip文件
  2. 直接使用UploadedFile对象:Django的UploadedFile本身实现了文件操作接口,可直接作为ZipFile的参数,不需要额外用io.BytesIO转换
  3. 跳过目录项:解压时会包含目录,判断文件名结尾的/来跳过,避免无效处理
  4. 简化保存逻辑:把user赋值和创建记录合并成一步,避免额外的save()调用
  5. 调整return位置:原代码在循环内return会导致只处理第一个文件就停止,现在所有文件处理完再返回页面

注意:如果你的UploadedFile.document字段要存储二进制文件(比如图片、音频),不要调用.decode('utf-8'),同时要确保字段类型是models.BinaryField而不是TextField。

内容的提问来源于stack exchange,提问作者Leenah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:30:58