2012-06-12 41 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 

您還必須確保列表的視圖功能返回什麼拉鍊功能回報。