django将ajax响应传递给php变量

时间:2012-06-14 06:34:07

标签: jquery python ajax django

我正在使用ajax向我的django函数发送请求,然后生成一个zip文件并将其提供给用户。如果我转到网址domain.com/django/builder/zipit/,文件会按预期生成并下载到我的计算机,但是当使用ajax并且返回响应时,ajax无法下载它。我可以将响应传递给php变量并以这种方式下载吗?使用iframe不会起作用,因为文件是动态创建的。

AJAX

$.ajax({
    type: 'POST',
    url: '/django/builder/zipit/',
    data: serialize,
    success: function(response){
        //pass response to php somehow
    }

views.py

def send_zipfile(request):
temp = tempfile.TemporaryFile()
archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
filename = '/home/dbs/public_html/download/video.html'
archive.write(filename, 'file.html')
archive.close()
wrapper = FileWrapper(temp)
response = HttpResponse(wrapper, content_type='application/zip', mimetype='application/x-download')
response['Content-Disposition'] = 'attachment; filename=dbs_content.zip'
response['Content-Length'] = temp.tell()
temp.seek(0)
return response

1 个答案:

答案 0 :(得分:0)

你不需要将它传递给PHP变量。在django本身都可以。

mimetype设置为application / x-zip-compressed

但要注意,在每个请求上创建zip存档是个坏主意,这可能会导致您的服务器崩溃(如果存档很大,则不计算超时)。性能方面的方法是在文件系统中的某处缓存生成的输出,并仅在源文件发生更改时重新生成它。更好的想法是提前准备档案(例如通过cron作业)并让你的网络服务器像往常一样为它们提供服务。

# archive_list = ["ZipTest1.txt", "ZipTest2.txt", "ZipTest3.txt"]
# # save the files in the archive_list into a PKZIP format .zip file
# zfilename = "Wife101.zip"
# zout = zipfile.ZipFile(zfilename, "w")
# for fname in archive_list:
# zout.write(fname)
# zout.close()
return HttpResponse(zout,mimetupe="application/x-zip-compressed")