FastApi-14-文件上传-2

759 阅读1分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

UploadFile

接上篇,实际开发中,我们需要在上传文件的时候拿到文件本体以及文件的元数据信息。

但是实际操作中,你会发现,File 对象是可以使用 len 函数获取大小的,但是 File 对象没有名称,类型等属性。而 UploadFile 对象虽然有名称,类型等 属性,但是其没有直接获取文件大小的属性。

通过阅读源码,我们会发现,UploadFile 是有一个 file 属性的,这样我们就可以拿到 file 对象,但是这个 file 对象是 SpooledTemporaryFile 类型的,我们可以通过 read 方法拿到 file 文件对象内容,再通过 len 函数即可得出其大小。

视图函数代码

from fastapi import File,UploadFile
from typing import List

@app.post('/upfile1/')
async def up_f1(request:Request,upload_list:List[UploadFile]=File(...)):
    return templates.TemplateResponse(
        'f.html',
        {
            "request":request,
            "file_names":[dd.filename for dd in upload_list],
            "file_sizes":[len(ds.read())/1024 for ds in [dd.file for dd in upload_list]],
            "file_types":[dd.content_type for dd in upload_list]
            })

信息展示页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>File</title>
</head>
<body>
    <h1>文件大小:{{ file_sizes }} KB</h1>
    <h1>文件名字:{{ file_names }}</h1>
    <h1>文件类型:{{ file_types }}</h1>
</body>
</html>

选择多个文件,点击显示文件信息:

可以看到,我们的需求已经实现。

Tip

有的朋友可能会发现,你的文件上传框无法选择多个文件,这是怎么回事呢? 答案是:你的 input 标签缺少了 multiple 属性。

multiple 属性规定输入字段可选择多个值。如果使用该属性,则字段可接受多个值。

<form action="/upfile1/" method="POST" enctype="multipart/form-data">
        <input type="file" name='upload_list' multiple>
        <input type="submit" value="点击显示文件信息">
    </form>

如上,即可实现多个文件的上传。

感谢您的阅读,别忘了关注,点赞,评论,转发四连哟!