上传文件

概述

通过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