2016-08-11 2 views
0

Я знаю о this question. Но вы не можете писать в файловую систему в движке приложения (shutil или zipfile требуют создания файлов).Как zip или tar статическая папка, не записывая ничего в файловую систему в python?

Поэтому в основном мне нужно архивировать что-то вроде /base/nacl используя почтовый индекс или деготь, и записать вывод в веб-браузере страницу с просьбой (выход никогда не будет превышать 32 Мб).

ответ

1

Так получилось, что я должен был решить ту же самую проблему сегодня :) Это работает для меня:

import StringIO 
    import tarfile 

    fd = StringIO.StringIO() 

    with tarfile.open(mode="w:gz", fileobj=fd) as tgz: 
     tgz.add('dir_to_download') 

    self.response.headers['Content-Type'] ='application/octet-stream' 
    self.response.headers['Content-Disposition'] = 'attachment; filename="archive.tgz"' 

    self.response.write(fd.getvalue()) 

Ключевые моменты:

  • используется StringIO подделать файл в памяти
  • использовал fileobj, чтобы передать объект поддельного файла tarfile.open() (также поддерживается gzip.GzipFile(), если вы предпочитаете gzip вместо tarfile)
  • набор заголовков для представления ответа в виде загружаемого файла
Смежные вопросы