Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django HTTP响应未正确命名文件_Python_Django - Fatal编程技术网

Python Django HTTP响应未正确命名文件

Python Django HTTP响应未正确命名文件,python,django,Python,Django,我有一个Django脚本,可以在服务器上压缩文件,并在向服务器发送查询时发送zip文件。但是,zip文件以“download”而不是data.zip的名称持续下载,data.zip是指定名称的内容。你知道为什么吗?我的代码如下。提前谢谢!我遗漏了导入一些图像和html的部分代码,因为我不认为它们是问题的一部分,但如果必要,我可以提供 from django.http import HttpResponse from django.core.servers.basehttp import File

我有一个Django脚本,可以在服务器上压缩文件,并在向服务器发送查询时发送zip文件。但是,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 
添加图像以显示网页,该网页显示何时将临时搜索(0)添加到移动到起始位置。 尝试不使用引号:

resp['Content-Disposition'] = 'attachment; filename=data.ZIP'
我以前做过,总是不加引号。此外,请指出:

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

您可以尝试使用
content\u type
更改
mimetype
,如下所示:

resp = HttpResponse(wrapper, content_type="application/octet-stream")
更新:此答案显示了一个有效的代码。您可以在某些视图中对其进行开箱即用的测试


希望这有帮助

我只是试了一下,但没用。我在它周围加了双引号,因为我在网上看到一些地方,如果文件名周围没有双引号,一些浏览器将无法识别它。但是不管有没有引号,它都不起作用。谢谢你!实际上,在文档中,有引号。您是否阅读了有关内容类型的信息?我认为这可能是另一个问题。我曾经用一些最小的代码让它工作过一次,我将把它分享给你,看看它是否在你的盒子里工作。更新了我的答案我尝试了所有不同的内容类型,如application/zip、application/octet-stream和application/x-zip-compressed,但都没有产生任何不同的结果。你的答案中的代码可以工作,但是,我无法根据该答案让我的代码工作。我尝试将临时搜索(0)移到开头,浏览器显示只显示一个网页,不下载任何内容。如果有帮助的话,我在我的主要答案中添加了一个屏幕截图。因为tell只说文件中的当前位置,也许你可以尝试不使用
内容长度
,这似乎不是问题,但只是一个想法。另外,为了以防万一,请从另一个浏览器中尝试。这应该是一个简单的解决办法:(不明白为什么会给我们带来这么多麻烦:(