ich hoffe ihr könnt mir nochmal helfen.
Und zwar möchte ich dem user anbieten größere Mengen an Daten als zip zu downloaden.
Und dieses Zipfile möchte ich gerne nicht auf die Platte schreiben sondern im RAM zusammenbasteln und von dort aus an den user senden.
Das ganze klappt auch schon so halb, allerdings sind die gezippten Daten leer.
Edit:
Der Übersicht halber hab ich das mal zusammengefasst (und hoffentlich nichts wichtiges vergessen)
darunter ist dann noch mal die ganze funktion in der ich es benutzte.
Zusammenfassung:
Code: Alles auswählen
import StringIO
import zipfile
in_memory_zip = StringIO.StringIO()
zf = zipfile.ZipFile(in_memory_zip, "a", zipfile.ZIP_DEFLATED, False)
for file in list:
zf.writestr(filename, file)
for zfile in zf.filelist:
zfile.create_system = 0
zf.close()
in_memory_zip.seek(0)
in_memory_zip.getvalue()
return send_file(in_memory_zip, attachment_filename=attachment_name, as_attachment=True)
Code: Alles auswählen
import StringIO
import zipfile
@app.route('/download_pictures_as_zipfile')
def dl_as_zip():
in_memory_zip = StringIO.StringIO()
zf = zipfile.ZipFile(in_memory_zip, "a", zipfile.ZIP_DEFLATED, False)
x_list = []
_list = []
db_list = []
if 'idlist' in session:
_list = session['idlist']
else:
return render_template('fail.html')
conn = engine.connect()
db_session = Session(bind=conn)
for elem in _list: # prevent removing first item in session cookie on every reload
x_list.append(elem)
attachment_name = 'lxm_'+x_list[0]+'.zip'
del x_list[0]
for item in x_list:
get_data = select([Pictures], Pictures.data_id == item)
data = conn.execute(get_data)
db_list.append([])
for elem in data:
db_list[-1].append(elem.storename)
db_list[-1].append(elem.sha1)
db_list[-1].append(elem.extension)
db_session.close()
for elem in db_list:
# print os.path.isfile(os.path.join(app.config['DOWNLOAD_FOLDER'],elem[1]+'.'+elem[2]))
file_to_zip = os.path.join(app.config['DOWNLOAD_FOLDER'],elem[1]+'.'+elem[2])
zi.writestr(elem[0],file_to_zip)
for zfile in zf.filelist:
zfile.create_system = 0
zf.close()
in_memory_zip.seek(0)
in_memory_zip.getvalue()
return send_file(in_memory_zip, attachment_filename=attachment_name, as_attachment=True)