首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask:获取request.files对象的大小

问Flask:获取request.files对象的大小
EN

Stack Overflow用户
提问于 2013-04-03 03:43:40
回答 5查看 36.2K关注 0票数 28

我想要得到上传图片的大小,以控制它是否大于最大文件上传限制。我试过这个:

代码语言:javascript
复制
@app.route("/new/photo",methods=["POST"])
def newPhoto():

    form_photo = request.files['post-photo']
    print form_photo.content_length

它打印了0。我做错了什么?我应该从图像的临时路径中找到它的大小吗?Python中有没有类似PHP的$_FILES['foo']['size']?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-03 16:38:15

这里有几件事需要注意- content_length属性将是浏览器报告的文件上传的内容长度,但不幸的是,正如docs和source中所指出的,许多浏览器不发送该内容。

至于您的TypeError,下一件要注意的事情是,500KB以下的文件上传会作为StringIO object存储在内存中,而不是假脱机到磁盘(请再次参阅这些文档),因此您的stat调用将失败。

MAX_CONTENT_LENGTH是拒绝上传超过你想要的文件的正确方法,如果你需要它,唯一可靠的确定数据长度的方法是在你处理完上传之后找出它-或者在你.save()d文件之后统计它:

代码语言:javascript
复制
request.files['file'].save('/tmp/foo')
size = os.stat('/tmp/foo').st_size

或者,如果您没有使用磁盘(例如,将其存储在数据库中),请计算您已读取的字节数:

代码语言:javascript
复制
blob = request.files['file'].read()
size = len(blob)

不过,如果MAX_CONTENT_LENGTH非常大,显然要小心不要将太多数据读入内存

票数 45
EN

Stack Overflow用户

发布于 2014-05-12 12:25:47

如果您不想首先将文件保存到磁盘,请使用以下代码,这适用于内存流

代码语言:javascript
复制
import os

file = request.files['file']
file.seek(0, os.SEEK_END)
file_length = file.tell()

否则,这样会更好。

代码语言:javascript
复制
request.files['file'].save('/tmp/file')
file_length = os.stat('/tmp/file').st_size
票数 34
EN

Stack Overflow用户

发布于 2013-04-03 03:51:41

设置最大文件上传限制的正确方法是通过MAX_CONTENT_LENGTH应用程序配置。例如,如果您想要设置16MB的上传限制,您可以对您的应用程序配置执行以下操作:

代码语言:javascript
复制
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

如果上传的文件太大,Flask会自动返回状态代码413 Request Entity too large -这应该在客户端处理。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15772975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档