这是我参与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>
如上,即可实现多个文件的上传。
感谢您的阅读,别忘了关注,点赞,评论,转发四连哟!