更新:我得到了要创建的 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/