2012-06-14 81 views
-2

我使用ajax向我的django函数发送请求,然后生成一个zip文件并将其提供给用户。如果我去url domain.com/django/builder/zipit/文件如预期生成并下载到我的电脑,但使用ajax和响应返回时,ajax不能下载它。我可以将响应传递给一个php变量并以这种方式下载吗?使用iframe不会工作,因为该文件是动态创建的。django将ajax响应传递给php变量

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

PHP与它有什么关系? –

+0

http://bytes.com/topic/javascript/answers/610641-file-download-ajax – Menztrual

+0

你的回应内容是什么? –

回答

0

你不需要它传递给PHP variable.Everything可能在Django本身。

MIME类型设置为应用程序/ x-ZIP压缩

但要注意,创建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") 
+0

我将我的views.py添加到我的文章 – user1442957

+0

尝试上面提到的mimetype –

+0

我做了,我工作,如果我直接访问链接,但如果我从ajax调用它,它不会下载 – user1442957