我正在将 web.py 用于一个小项目,并且我希望用户能够在服务器上的 /files 目录中访问文件。我似乎无法找到如何在 GET 请求中返回文件,所以我不知道如何做到这一点。
本质上想要做的是:
urls = ('/files/+', 'files')
class files:
def GET(self)
#RETURN SOME FILE
有没有一种简单的方法可以从 GET 请求中返回文件?
我正在将 web.py 用于一个小项目,并且我希望用户能够在服务器上的 /files 目录中访问文件。我似乎无法找到如何在 GET 请求中返回文件,所以我不知道如何做到这一点。
本质上想要做的是:
urls = ('/files/+', 'files')
class files:
def GET(self)
#RETURN SOME FILE
有没有一种简单的方法可以从 GET 请求中返回文件?
我想出了这个 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 中可用。
您可以读取文件的内容并将它们流式传输给用户,但我不相信文件句柄是可序列化的。
允许用户访问和修改服务器上的文件或将文件复制到他们自己的机器上似乎是一个潜在的安全漏洞。我认为你应该重新评估你想要完成的事情。
这就是我通过使用生成器而不是将整个文件读入内存的方式:
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