扫码关注官方订阅号
我理解你的问题是不希望在服务器上从远程下载文件完毕,再传给用户,而是希望从远程下载一点就传给用户一点,直到完成是吧?
建议你用requests库,将stream设置为True
rf = requests.get(url, stream=True) for chunk in rf.iter_content(chunk_size=1024*10): if not chunk: break response.write(chunk)
因为不知道你的web服务器是什么,上面代码就表达这么个意思,希望能有用。
回答题主,在你评论的评论里,我不知道怎么贴代码。。汗。。。我就写在这里吧。
看到你的代码,确定你用的是tornado,那可以知道代码问题在于你仅仅将获取文件那里开启了流模式,但是你的tornado返回客户端数据没有开启流模式,将你的代码简单改一下(因为你那个下载文件的url我这里不知道为什么不能访问,我这里是从百度下载jdk),换句话说,要用流的方式读取,也要用流的方式发送:
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests import tornado.ioloop import tornado.web from tornado import gen class MainHandler(tornado.web.RequestHandler): @gen.coroutine #流方式注解 def get(self): rf = requests.get('http://dlsw.baidu.com/sw-search-sp/soft/10/25851/jdk-8u40-macosx-x64.1427945120.dmg', stream=True) for chunk in rf.iter_content(chunk_size=1024*10): if not chunk: break self.write(chunk) self.flush() #写一点就发送一点 application = tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": application.listen(8080) tornado.ioloop.IOLoop.instance().start()
你再试试,我用命令:wget http://127.0.0.1:8080 -O jdk.dmg命令,立刻可以看到有下载进度,如果将1024*10改成1024*10*10,估计你会看到下载进度是1M,1M的增加的。
1024*10
1024*10*10
希望对你有用,谢谢
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
我理解你的问题是不希望在服务器上从远程下载文件完毕,再传给用户,而是希望从远程下载一点就传给用户一点,直到完成是吧?
建议你用requests库,将stream设置为True
因为不知道你的web服务器是什么,上面代码就表达这么个意思,希望能有用。
回答题主,在你评论的评论里,我不知道怎么贴代码。。汗。。。我就写在这里吧。
看到你的代码,确定你用的是tornado,那可以知道代码问题在于你仅仅将获取文件那里开启了流模式,但是你的tornado返回客户端数据没有开启流模式,将你的代码简单改一下(因为你那个下载文件的url我这里不知道为什么不能访问,我这里是从百度下载jdk),换句话说,要用流的方式读取,也要用流的方式发送:
你再试试,我用命令:wget http://127.0.0.1:8080 -O jdk.dmg命令,立刻可以看到有下载进度,如果将
1024*10
改成1024*10*10
,估计你会看到下载进度是1M,1M的增加的。希望对你有用,谢谢