【问题标题】:Access files from web.py urls从 web.py url 访问文件
【发布时间】:2011-06-21 23:31:49
【问题描述】:

我将 web.py 用于一个小项目,并且我希望用户能够访问服务器上 /files 目录中的文件。我似乎无法找到如何在 GET 请求中返回文件,所以我不知道如何执行此操作。

真正想做的就是:

urls = ('/files/+', 'files')

class files:

  def GET(self)

    #RETURN SOME FILE

有没有从 GET 请求返回文件的简单方法?

【问题讨论】:

    标签: python web-services web-applications web.py


    【解决方案1】:

    我想出了这个 webpy GET 方法:

    def GET(self):
        request = web.input( path=None )
        getPath = request.path
        if os.path.exists( getPath ):
            getFile = file( getPath, 'rb' )
            web.header('Content-type','application/octet-stream')
            web.header('Content-transfer-encoding','base64') 
            return base64.standard_b64encode( getFile.read( ) )
        else:
            raise web.notfound( )
    

    其他受访者在建议您仔细考虑安全影响时是正确的。在我的例子中,我们会将这样的代码包含到一个管理 Web 服务中,该服务将(应该!)仅在我们的内部 LAN 中可用。

    【讨论】:

      【解决方案2】:

      您可以读取文件的内容并将它们流式传输给用户,但我不认为文件句柄是可序列化的。

      允许用户访问和修改服务器上的文件或将文件复制到他们自己的机器上似乎是一个潜在的安全漏洞。我认为你应该重新评估你想要完成的工作。

      【讨论】:

      • 我非常希望用户能够下载他们上传的文件。打算使用随机生成的 url 来实际访问文件,但只需要弄清楚如何返回文件。只是希望用户点击 url 并在他们的浏览器中获得“另存为”对话框。
      • 我不明白你为什么希望它是“随机的”。 REST API 将具有文件的唯一键作为参数。
      • 事实上,你是对的。但这并不是我真正担心的。这是我第一次尝试任何类型的 Web 开发,所以并没有过度担心安全等问题。
      • 您的用户将文件上传到您的网站。如果您不考虑安全性,我为什么要上传文件供您保留?
      【解决方案3】:

      这就是我使用生成器而不是将整个文件读入内存的方式:

          web.header("Content-Disposition", "attachment; filename=%s" % doc.filename)
          web.header("Content-Type", doc.filetype)
          web.header("Transfer-Encoding","chunked")
          f = open(os.path.join(config.upload_dir, doc.path, doc.filename), "rb")
          while 1:
              buf = f.read(1024 * 8)
              if not buf:
                  break
              yield buf
      

      【讨论】:

      • 我试过这个方法,但是下载停止时出现网络错误
      猜你喜欢
      • 2018-04-19
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 2014-05-13
      • 2017-08-14
      • 2012-03-22
      • 1970-01-01
      • 2017-11-30
      相关资源
      最近更新 更多