2015-04-21 2 views
0

Мне нужно сгенерировать несколько отчетов csv, сжать и выполнить zip для пользователя. Я использую this snippet в качестве ссылкиЗагрузите zip-файл, созданный полностью в памяти с помощью Django

... 
    temp = StringIO.StringIO() 
    with zipfile.ZipFile(temp,'w') as archive: 
     for device in devices: 
      csv = Mymodel.get_csv_for(device) 
      archive.writestr('{}_device.csv'.format(device), str(csv)) 

    response = HttpResponse(FileWrapper(temp), content_type='application/zip') 
    response['Content-Disposition'] = 'attachment; filename="devices.zip"') 

    return response 

Глядя на archive.listname() я могу видеть имена файлов. Глядя на temp.getvalue(), я вижу некоторую строку, но когда я загружаю файл, он выходит пустым.

ответ

1

Перед возвратом ответа вам нужно позвонить temp.seek(0), иначе Python попытается прочитать файл памяти с его конца (где вы оставили его после записи в него архива) и, следовательно, не найдете никакого содержимого и не получите пустой HTTP-ответ.

Вы также должны использовать StreamingHttpResponse вместо HttpResponse.

Это даст:

... 
temp = StringIO.StringIO() 
with zipfile.ZipFile(temp,'w') as archive: 
    for device in devices: 
     csv = Mymodel.get_csv_for(device) 
     archive.writestr('{}_device.csv'.format(device), str(csv)) 

response = StreamingHttpResponse(FileWrapper(temp), content_type='application/zip') 
response['Content-Disposition'] = 'attachment; filename="devices.zip"') 
response['Content-Length'] = temp.tell() 

temp.seek(0) 

return response 
+0

Это не работает. – haki

+0

Он работает на моем компьютере, вы все еще получаете пустой файл? – aumo

+0

Да. Я все еще получаю пустой файл. – haki

Смежные вопросы