Python zipfile 未交付给用户

标签 python django

更新:我得到了要创建的 zip 文件,但响应仍然无法正常工作。这是更新后的代码。

def index(request):
    if request.is_ajax():
        uploaded = request.body
        newstring = "{\"testdata\": [" + uploaded + "]}"
        data = json.loads(newstring)
        num_lines = sum(len(v) for v in data.itervalues())
        testing(data, num_lines)

        zip_subdir = 'testapi'
        zip_filename = '%s.zip' % zip_subdir

        zf = z.ZipFile(zip_filename, mode='w')
        zf.write('Test.xlsx')
        zf.close()

        zip_file = open(zip_filename, 'r')
        response = HttpResponse(zip_file, content_type='application/x-zip-compressed')
        response['Content-Disposition'] = 'attachment; filename=%s' % zip_filename
        return response

为了确定,我删除了 zip 文件和 Excel 电子表格,运行程序后,两者都已正确创建。 Excel 电子表格中填充了数据,并将其副本放入生成的 zip 存档中。但是,它仍然没有发送给用户。知道响应可能出了什么问题吗?未显示任何错误,但未传送 zip 文件。

下面是原始问题。


我正在尝试让我的 Django 应用程序将文件写入 zip 并将它们发送给用户。这是我认为的代码的一部分:

def index(request):
    if request.is_ajax():
        uploaded = request.body
        newstring = "{\"testdata\": [" + uploaded + "]}"
        data = json.loads(newstring)
        num_lines = sum(len(v) for v in data.itervalues())
        testing(data, num_lines)

        zip_subdir = 'testapi'
        zip_filename = '%s.zip' % zip_subdir

        s = StringIO.StringIO()
        zf = z.ZipFile(s, 'w')
        zf.write('Test.xlsx')
        zf.close()

        response = HttpResponse(s.getvalue(), content_type='application/x-zip-compressed')
        response['Content-Disposition'] = 'attachment; filename=%s' % zip_filename
        return response

本质上,用户按下按钮,发出 ajax 请求以从外部 API 获取 JSON,然后将此 JSON 数据发送到服务器并放入 Excel 电子表格(称为“Test.xlsx”)。所有这些都正常工作。

问题在于未正确创建 zip 存档(“testapi.zip”)。奇怪的是,当用户通过表单(而不是使用 API)上传 JSON 转储时,它与我之前使用的代码相同,并且它之前有效。但是,现在它不会创建 zip 文件。此外,即使我手动将名为“testapi.zip”的 zip 文件放在正确的目录中,响应也不起作用(同样,这以前可以工作 - 在这个应用程序的先前版本中,zip 文件被发送到用户并自动下载)。没有错误返回,但什么也没有发生。

知道会发生什么吗?

最佳答案

问题似乎出在下面的代码中——

s = StringIO.StringIO()
zf = z.ZipFile(s, 'w')

您似乎在 buffer 中打开一个 zip 文件,而不是在名称来自 zip_filename 的位置创建一个 zip 文件。

尝试使用文件的路径/名称打开文件,而不是使用 StringIO.StringIO() 。像这样 -

zf = z.ZipFile(zip_filename,'w')

编辑:

尝试使用绝对路径而不是相对路径。喜欢 -

zip_subdir = '/path/to/zip/file/testapi'

关于Python zipfile 未交付给用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30944652/

相关文章:

django - 选择一个有效的选项。该选择不是可用的选择之一

python - 带有附加参数的 Django redirect()

sql - Django 单元测试中的原始 sql 查询

python - Django ManyToMany 按集合大小或集合中的成员过滤

python - 提交表格并上传带有请求的文件

python - 错误 : No module named psycopg2. 扩展

python - 如何从字典字符串中恢复 python dateutil.rrule 对象?

python - 如何将行转置为 Pandas 中的列?

python - 如何使用PySpark获取最高tf-idf对应的单词?

python - Pygame 事件不起作用