2

我有一个 Django 脚本,它可以压缩服务器上的文件,并在将查询发送到服务器时将压缩文件发送出去。但是,zip 文件以“download”而不是 data.ZIP 的名称继续下载,data.ZIP 是指定名称的内容。任何想法为什么?我的代码如下。提前致谢!我省略了导入一些图像和 html 的部分代码,因为我不认为它们是问题的一部分,但如有必要,我可以提供。

from django.http import HttpResponse
from django.core.servers.basehttp import FileWrapper
import urlparse
from urllib2 import urlopen
from urllib import urlretrieve
import os
import sys
import zipfile
import tempfile
import StringIO

def index(req):

    temp = tempfile.TemporaryFile()
    archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
    # Open StringIO to grab in-memory ZIP contents
    s = StringIO.StringIO()
    fileList = os.listdir('/tmp/images')
    fileList = ['/tmp/images/'+filename for filename in fileList]
    # The zip compressor
    zip = zipfile.ZipFile(s, "w")
    for file in fileList:
        archive.write(file, os.path.basename(file)) 
    zip.close()
    archive.close()
    wrapper = FileWrapper(temp)
    #Get zip file, set as attachment, get file size, set mime type
    resp = HttpResponse(wrapper, mimetype = "application/octet-stream")
    resp['Content-Disposition'] = 'attachment; filename="data.ZIP"'
    resp['Content-Length'] = temp.tell()
    temp.seek(0)
    return resp 

添加的图像显示网页,显示何时将 temp.seek(0) 添加到移动到开头。 在此处输入图像描述

4

1 回答 1

5

尝试不带引号:

resp['Content-Disposition'] = 'attachment; filename=data.ZIP'

我以前做过,总是没有引号。此外,文档指出:

要告诉浏览器将响应视为文件附件,请使用 content_type 参数并设置 Content-Disposition 标头。

您可以尝试mimetypecontent_type这样更改:

resp = HttpResponse(wrapper, content_type="application/octet-stream")

更新:此答案文件在 Python 中下载始终为空白,Django显示了有效的代码。您可以在某些视图中开箱即用地对其进行测试。

希望这可以帮助!

于 2013-06-25T13:16:29.197 回答