How do I stream a file using werkzeug?

删除回忆录丶 提交于 2019-12-18 03:38:30

问题


I want to stream a big file via werkzeug.
Currently my wsgi application looks like this:

from werkzeug.wrappers import Request, Response
from werkzeug.wsgi import ClosingIterator, wrap_file
import os

class Streamer(object):

    def __init__(self):
        pass

    def __call__(self, environ, start_response):
        request = Request(environ)
        filename = os.getcwd() + "/bigfile.xml"
        try:
            response = wrap_file(environ, open(filename) )
            return response
        except HTTPException, e:
            response = e
            return ClosingIterator(response(environ, start_response))

I'm not sure what I should do with the object returned by the wrap_file function.


回答1:


Haven't tried myself but I think following will work.

g = file(path_to_bigfile) # or any generator
return Response(g, direct_passthrough=True)



回答2:


Just in case one would additionally like to: 1. preserve the file name 2. issue download without page redirect

# file_name assumed to be known
# file_path assumed to be known
file_size = os.path.getsize(file_path)
fh = file(file_path, 'rb')
return Response(fh,
                mimetype='application/octet-stream',
                headers=[
                    ('Content-Length', str(file_size)),
                    ('Content-Disposition', "attachment; filename=\"%s\"" % file_name),
                ],
                direct_passthrough=True)


来源:https://stackoverflow.com/questions/5166129/how-do-i-stream-a-file-using-werkzeug

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!