通过Django下载Zip文件,文件解压为cpzg

Posted

技术标签:

【中文标题】通过Django下载Zip文件,文件解压为cpzg【英文标题】:Downloading Zip file through Django, file decompresses as cpzg 【发布时间】:2018-03-15 15:29:04 【问题描述】:

我的目标是将一系列字符串解析为一系列文本文件,这些文本文件被压缩为 Zip 文件,并由 Web 应用程序使用 Django 的 HTTP 响应下载。

在 PyCharm 中本地开发,我的方法输出一个名为“123.zip”的 Zip 文件,其中包含 6 个名为“123_1”、“123_2 等”的单独文件。包含我的短语中的字母没有问题。

问题是当我将代码推送到我的网络应用程序并包含 Django HTTP 响应时,该文件将下载,但当我去提取它时,它会生成“123.zip.cpzg”。反过来提取它会给我 123.zip(1) 一个令人沮丧的无限循环。有什么建议我哪里出错了吗?

在本地生成“123.zip”的代码:

def create_text_files1():
    JobNumber = "123"
    z = zipfile.ZipFile(JobNumber +".zip", mode ="w")
    phrase = "A, B, C, D, EF, G"
    words = phrase.split(",")
    x =0

    for word in words:
        word.encode(encoding="UTF-8")
        x = x + 1
        z.writestr(JobNumber +"_" + str(x) + ".txt", word)
    z.close()

我的网络应用中方法的附加部分:

    response = HTTPResponse(z, content_type ='application/zip')
    response['Content-Disposition'] = "attachment; filename='" + str(jobNumber) + "_AHTextFiles.zip'"

【问题讨论】:

【参考方案1】:

仔细查看example provided in this answer。

注意一个 StringIO 被打开,zipFile 被调用,StringIO 作为 "File-Like Object",然后,关键的是,在 zipFile 关闭后,StringIO 在 HTTPResponse 中返回。

# Open StringIO to grab in-memory ZIP contents
s = StringIO.StringIO()

# The zip compressor
zf = zipfile.ZipFile(s, "w")

# Grab ZIP file from in-memory, make response with correct MIME-type
resp = HttpResponse(s.getvalue(), mimetype = "application/x-zip-co mpressed")

在你的情况下,我会推荐一些东西。

    使用 BytesIO 实现前向兼容性 利用 ZipFile 的内置上下文管理器 在您的 Content-Disposition 中,请注意“jobNumber”与“JobNumber”

试试这样的:

def print_nozzle_txt(request):
    JobNumber = "123"
    phrase = "A, B, C, D, EF, G"
    words = phrase.split(",")
    x =0

    byteStream = io.BytesIO()

    with zipfile.ZipFile(byteStream, mode='w', compression=zipfile.ZIP_DEFLATED,) as zf:
        for word in words:
            word.encode(encoding="UTF-8")
            x = x + 1
            zf.writestr(JobNumber + "_" + str(x) + ".txt", word)

    response = HttpResponse(byteStream.getvalue(), content_type='application/x-zip-compressed')
    response['Content-Disposition'] = "attachment; filename='" + str(JobNumber) + "_AHTextFiles.zip'"
    return response

【讨论】:

以上是关于通过Django下载Zip文件,文件解压为cpzg的主要内容,如果未能解决你的问题,请参考以下文章

Jersey Client 下载 ZIP 文件并高效解压

无法从 dist 下载 symfony/finder:解压 ZIP 文件时出错。损坏的文件?

如何解压zip文件?

ZIP格式的文件下载后怎么解压?

Android 下载Zip文件,并解压到本地

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩