def files_get(path):
"""
getattr(path) -> GET /files/<path>?op=getattr
200 {"st_mode": <mode int>, "st_size": <size int>}
404 Not Found
readdir(path) -> GET /files/<path>?op=readdir
200 {"files": ["<file str>", ... ]}
404 Not Found
read(path, size, offset) -> GET /files/<path>?op=read&size=<size>&offset=<offset>
200 "<base64 str>"
404 Not Found
"""
if 'op' not in flask.request.args:
return 'Missing operation.', 400
op = flask.request.args['op']
if path == "/":
path = app.config['serve_dir']
else:
path = flask.safe_join(app.config['serve_dir'], path)
if op == 'getattr':
try:
info = os.stat(path)
return flask.jsonify({'st_mode': info.st_mode, 'st_size': info.st_size})
except FileNotFoundError:
return 'File not found.', 404
elif op == 'readdir':
try:
return flask.jsonify({"files": os.listdir(path)})
except FileNotFoundError:
return 'File not found.', 404
elif op == 'read':
if 'size' not in flask.request.args:
return 'Missing size.', 400
elif 'offset' not in flask.request.args:
return 'Missing offset.', 400
size = int(flask.request.args['size'])
offset = int(flask.request.args['offset'])
# Open, seek, read, close
try:
fd = os.open(path, os.O_RDONLY)
os.lseek(fd, offset, os.SEEK_SET)
buf = os.read(fd, size)
os.close(fd)
except FileNotFoundError:
return 'File not found.', 404
return flask.jsonify({"data": base64.b64encode(buf).decode()})
return 'Unknown operation.', 400
评论列表
文章目录