如何在Flask中获取FileStorage对象的文件大小?含上传校验需求
在Flask中保存FileStorage文件前获取文件大小的方法
嘿,这个场景我太熟悉了!其实不用等到保存文件之后再获取大小,FileStorage对象本身就有两种方式可以在保存前拿到文件大小,下面给你详细说:
方法1:直接使用content_length属性
Flask的FileStorage对象内置了content_length属性,它对应HTTP请求里的Content-Length头,能直接返回文件的字节大小:
from flask import request file = request.files['file'] file_size = file.content_length # 结果是字节数,比如1024就是1KB
⚠️ 注意:如果客户端没有在请求中发送Content-Length头,这个属性会返回None,所以用的时候最好先做个非空判断。
方法2:通过文件指针操作(更可靠)
如果担心content_length不可靠,我们可以利用FileStorage包装的类文件对象特性,通过移动文件指针来获取准确大小:
from flask import request import os file = request.files['file'] # 将文件指针移动到文件末尾 file.seek(0, os.SEEK_END) # tell()方法返回当前指针位置,也就是文件的总字节数 file_size = file.tell() # 一定要把指针移回文件开头!不然保存文件的时候会从末尾开始写,导致文件为空 file.seek(0)
这个方法不管客户端有没有传Content-Length头,都能拿到准确的文件大小,是我平时更推荐的方式。
结合你的业务场景使用
拿到文件大小后,你就可以和目标路径下已存在的文件大小对比了:
import os target_path = "/your/public/download/path/filename.ext" if os.path.exists(target_path): existing_size = os.stat(target_path).st_size if existing_size == file_size: # 文件已存在,拒绝上传 return "该文件已存在,无需重复上传", 400 # 大小不一致,或者文件不存在,执行保存操作 file.save(target_path)
内容的提问来源于stack exchange,提问作者strymsg
相关产品推荐
相关产品推荐

