Tôi có thể tạo và phát trực tiếp văn bản, nhưng không thể tạo và phát trực tuyến tệp nén khi đang di chuyển.Tạo và phát tệp nén bằng Flask
from flask import Flask, request, Response,stream_with_context
import zlib
import gzip
app = Flask(__name__)
def generate_text():
for x in xrange(10000):
yield "this is my line: {}\n".format(x)
@app.route('/stream_text')
def stream_text():
response = Response(stream_with_context(generate_text()))
return response
def generate_zip():
for x in xrange(10000):
yield zlib.compress("this is my line: {}\n".format(x))
@app.route('/stream_zip')
def stream_zip():
response = Response(stream_with_context(generate_zip()), mimetype='application/zip')
response.headers['Content-Disposition'] = 'attachment; filename=data.gz'
return response
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
Thần sử dụng curl và gunzip:
curl http://127.0.0.1:8000/stream_zip > data.gz
gunzip data.gz
gunzip: data.gz: not in gzip format
Tôi không quan tâm nếu nó là zip, gzip, hoặc bất kỳ loại khác của nén.
generate_text
trong mã thực của tôi tạo ra hơn 4 GB dữ liệu vì vậy tôi muốn nén khi đang di chuyển.
Lưu văn bản thành tệp, nén, trả về tệp zip và xóa hơn không phải là giải pháp mà tôi theo sau.
Tôi cần tạo vòng lặp tạo một số văn bản -> nén văn bản đó -> dữ liệu đã nén trực tuyến cho đến khi tôi hoàn tất.
zip/gzip ... mọi thứ đều ổn miễn là nó hoạt động.
Tôi đoán rằng vì zlib.compress trả về một chuỗi, nên bạn không gửi mã byte gzip thực. –
@DrorHilman: đây là Python 2, vì vậy cả dữ liệu gzip và dữ liệu nén zlib thô đều là chuỗi. Nhưng có, bạn không thể sử dụng gzip để giải nén dữ liệu zlib thô trực tiếp, ít nhất là không có hackery (xem [Cách giải nén dữ liệu zlib trong UNIX?] (// unix.stackexchange.com/q/22834)). –