2012-06-12 35 views
1

我有一个复选框的形式。我试图做到这一点,如果用户检查“视频”框并提交表单,然后视频文件被压缩和Django生成一个动态下载弹出在用户屏幕上。我想为音频发生同样的事情。但是,如果用户选择了复选框并提交,则音频和视频文件将合并为一个zip文件并弹出一个下载文件给用户。我不希望这些存储在磁盘上,所以我使用StringIO。没有下载弹出来了python django动态压缩和下载

HTML

<form> 
<input type="checkbox" name="list" value="audio"/> Audio<br /> 
<input type="checkbox" name="list" value="video"/> Video<br /> 
<input type="submit" value="submit" /> 
</form> 

蟒蛇

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 
import cgitb; cgitb.enable() 
import cgi 
from zipfile import ZipFile 
from StringIO import StringIO 
from django.http import HttpResponse 
from django.core.servers.basehttp import FileWrapper 
files = 0 
def zip (content): 
    buffer= StringIO.StringIO() 
    z= zipfile.ZipFile(buffer, "w") 
    z.writestr(content) 
    z.close() 
    # generate the file 
    response = HttpResponse(FileWrapper(z), content_type='application/zip') 
    response['Content-Disposition'] = 'attachment; filename=z.zip' 
    return response 
form = cgi.FieldStorage() 
mylist = form.getlist('list') 
print 'Content-Type: text/plain\n' 
for item in mylist: 
    if item == 'video': 
    files = '../download/video.html' 
    zip(files) 
    elif item == 'audio': 
    files = '../download/audio.html' 
    zip(files) 
    elif item == 'audio' and 'video': 
    files = '../download/audio.html'+'../download/video.html' 
    zip(files) 
    else: 
    print 'nothing selected' 
+0

发布追踪... –

回答

1

可以肯定的for循环着的工作,最后ELIF内的第三代码永远不会被执行,因为它是一样的第二个 item == 'audio' and 'video'item == 'audio and True'相同,它与item == 'audio'相同

我窝ULD改变循环代码看起来有点更简单

files = [] 
for item in mylist: 
    if item == 'video': 
    files.append('../download/video.html') 
    elif item == 'audio': 
    files.append('../download/audio.html') 
zip(files) 

,然后refacor的zip处理文件

def zip (filenames): 
    buffer= StringIO.StringIO() 
    z= zipfile.ZipFile(buffer, "w") 
    [z.writestr(f) for f in filenames] 
    z.close() 
    # generate the file 
    response = HttpResponse(FileWrapper(z), content_type='application/zip') 
    response['Content-Disposition'] = 'attachment; filename=z.zip' 
    return response 

您还必须确保列表的视图功能返回什么拉链功能回报。