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