V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lydhr
V2EX  ›  Flask

flask 如何通过 http 请求下载一个文件

  •  
  •   lydhr · 2015-12-04 17:59:56 +08:00 · 5519 次点击
    这是一个创建于 3063 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 想写一个 ios 端通过 http 请求上传一个文件,然后处理后在下载下来
    • 服务器端用的 flask ,已经调通了上传,如何用 flask 处理下载文件的请求呢?
    • 查了 doc 的一个 send_from_directory 方法但是跑不起来
      上传文件代码

      @app.route('/saveFile', methods=['POST'])
      def saveObjZip():
      try:
          # We will save the zip file to disk.
          myfile = flask.request.files['myFile']
          filename_ = str(datetime.datetime.now()).replace(' ', '_') + \
              werkzeug.secure_filename(myfile.filename)
          filename = os.path.join(UPLOAD_FOLDER, filename_)
          myfile.save(filename)
          logging.info('Saving to %s.', filename)
      
      except Exception as err:
          logging.info('Uploaded file open error: %s', err)
          return err;
      
    4 条回复    2015-12-05 02:59:55 +08:00
    loading
        1
    loading  
       2015-12-04 18:19:31 +08:00 via Android
    如果下载不需要权限控制,建议 redirect 到 nginx 的静态文件夹。

    因为 flask 这种是阻塞的方式,如果只有一个线程,有人下载,你的服务将在下载全程不可用。
    loading
        2
    loading  
       2015-12-04 18:27:46 +08:00 via Android
    之前我问过一个相关的。
    http://v2ex.com/t/197801#reply4
    xavierskip
        3
    xavierskip  
       2015-12-04 21:48:00 +08:00
    确实下载文件不太应该用 web 框架来处理,直接交给 web server 当作静态文件处理。


    你说的不知道我理解对没有,例如就是返回数据 A.txt 文本文件内容,让浏览器以下载文件来处理,而不是直接给你在浏览器中打开了。

    需要在返回的 http header 中添加"Content-Disposition"

    你看一下这里 https://github.com/xavierskip/hupu_Album_Downloader/blob/master/web/index.py#L128
    ericls
        4
    ericls  
       2015-12-05 02:59:55 +08:00
    flask 可以配合 nginx 的内部路由 很好的实现文件下载功能
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1028 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:17 · PVG 06:17 · LAX 15:17 · JFK 18:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.