解压文件时出现“错误0x80070057:参数不正确”

Posted

技术标签:

【中文标题】解压文件时出现“错误0x80070057:参数不正确”【英文标题】:"Error 0x80070057: The parameter is incorrect" when unzipping files 【发布时间】:2019-07-23 14:04:12 【问题描述】:

我创建了一个函数来使用Weasyprint 创建多个 PDF,将它们压缩在一起并下载 zip 文件。当尝试使用内部 zip 程序在 Windows 10 上提取文件夹时,我收到此错误:

“一个意外错误使您无法复制文件。[...] 错误 0x80070057”

我可以跳过错误并提取文件。但是在最好的情况下,我想防止这个错误。

def get_all_shareholder_reports(request):
   current_shareholders = list(models.objects.all())

    zip_buffer = io.BytesIO()
    with zipfile.ZipFile(zip_buffer, "a") as zip_file:

        for shareholder in current_shareholders:
            pdf_file_handle = io.BytesIO()
            context_dict = get_report_details(pk=shareholder.shareholder_id)

            html_string = render_to_string('template.html',
                                           context_dict)

            html_handler = HTML(string=html_string, base_url=request.build_absolute_uri())
            html_handler.write_pdf(target=pdf_file_handle)
            pdf_file_handle.seek(0)
            pdf_string = pdf_file_handle.getvalue()
            pdf_file_name ='Shareholder_Report___.pdf'.format(context_dict['shareholder'].forename,
                                                                     context_dict['shareholder'].surname,
                                                                     datetime.datetime.now().strftime(
                                                                         "%d_%m_%Y_%H:%M:%S"))
            zip_file.writestr(zinfo_or_arcname=pdf_file_name, data=pdf_string)

    zip_buffer.seek(0)
    response = HttpResponse(zip_buffer.getvalue(), content_type="application/x-zip-compressed")

    response['Content-Disposition'] = 'attachment; filename=%s' % 'myzip.zip'

    return response

【问题讨论】:

【参考方案1】:

我想通了:zip 文件不喜欢文件名中的“:”。删除它们解决了这个问题。

pdf_file_name ='Shareholder_Report___.pdf'.format(context_dict['shareholder'].forename,
                                                                     context_dict['shareholder'].surname,
                                                                     datetime.datetime.now().strftime(
                                                                         "%d_%m_%Y_%H_%M_%S"))

【讨论】:

我有同样的错误信息,除了双引号字符。显然,我忘记将一个文件名中的双引号字符转换为弯引号字符(将文件从允许使用前一个字符的 Linux 机器传输到 Windows 10 机器时)。 (当文本很小时,很难发现不同引号字符之间的差异。)奇怪的是,尽管有错误,但我发现文件还是被提取了(如您的问题所示),Windows 将违规字符转换为下划线字符。 感谢您的回答。试图弄清楚 2 个小时,直到我看到这个。【参考方案2】:

您基本上需要清除 Windows 中所有保留字符的文件名:https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions

所以下面应该这样做"filename".replaceAll("[<>:\"/\\\\|?*]", "")

【讨论】:

以上是关于解压文件时出现“错误0x80070057:参数不正确”的主要内容,如果未能解决你的问题,请参考以下文章

解决VMware 安装tools时出现找不到文件的方法

如何解决centos7中unzip解压zip时出现中文乱码

使用 enumerate() 时出现“ValueError:需要超过 2 个值才能解压”

我的系统是windows7 64位旗舰版。安Directx时出现,不能信任一个安装所需的压缩文件。请高手指点

将 Django 应用程序部署到 AWS 时出现“ValueError:要解压的值太多”

tomcat启动时出现的问题“现此时不应有files/java/jre”