上传文件
概述
通过multipart/form-data
方式上传的文件,会变成一个FileField对象,并能够获取到文件的信息和内容。
示例
from aiohttp.web import Request
from lessweb import Bridge, post_mapping
@post_mapping('/upload')
async def upload(request: Request):
data = await request.post()
fid = data['id']
f = data['f']
content = f.file.read()
summary = content[:10] + b'...'
return {'id':fid, 'filename': f.filename, 'value': summary.decode(), 'size': len(content)}
def main():
bridge = Bridge()
bridge.add_route(upload)
bridge.run_app()
请求: curl -X POST --form id=6 --form f=@./example.py "http://localhost:8080/upload"
返回: {"id":"6","filename":"example.py","value":"from lessc...","size":206}
进阶
上面的例子中有不足之处,就是aiohttp.web.BaseRequest.post()
会一口气把整个文件读取到在内存中,这可能导致 OOM(Out Of Memory) 错误。可参考aiohttp官方文档给出的示例进行改进:https://docs.aiohttp.org/en/stable/web_quickstart.html#file-uploads