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

问题描述 投票:0回答:7

我想获取上传图片的大小来控制它是否大于最大文件上传限制。我试过这个:

@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']
的东西吗?

python flask
7个回答
58
投票

这里有一些事情需要注意 - content_length 属性将是浏览器报告的文件上传的内容长度,但不幸的是许多浏览器不发送此内容,如docssource中所述。

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

MAX_CONTENT_LENGTH 是拒绝大于您想要的文件上传的正确方法,如果您需要它,确定数据长度的唯一可靠方法是在处理上传后计算出来 - 要么在之后统计文件你已经

.save()
了:

request.files['file'].save('/tmp/foo')
size = os.stat('/tmp/foo').st_size

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

blob = request.files['file'].read()
size = len(blob)

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


44
投票

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

import os

file = request.files['file']
# os.SEEK_END == 2
# seek() return the new absolute position
file_length = file.seek(0, os.SEEK_END)

# also can use tell() to get current position
# file_length = file.tell()

# seek back to start position of stream, 
# otherwise save() will write a 0 byte file
# os.SEEK_END == 0
file.seek(0, os.SEEK_SET)

不然这样会更好

request.files['file'].save('/tmp/file')
file_length = os.stat('/tmp/file').st_size

22
投票

设置最大文件上传限制的正确方法是通过

MAX_CONTENT_LENGTH
应用程序配置。例如,如果您想设置 16 MB 的上传限制,您可以对应用程序配置执行以下操作:

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

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


7
投票

以下代码部分应该满足您的目的..


form_photo.seek(0,2)
尺寸 = form_photo.tell()


2
投票

正如其他人已经建议的那样,您应该使用

app.config['MAX_CONTENT_LENGTH'] 

限制文件大小。但 由于您特别想找出图像尺寸,您可以这样做:

import os
photo_size = os.stat(request.files['post-photo']).st_size
print photo_size

0
投票

您可以通过 popen from os import

先保存一下

photo=request.files['post-photo']
photo.save('tmp')

现在,只需获取尺寸即可

os.popen('ls -l tmp | cut -d " " -f5').read()
  • 以字节为单位
  • 对于兆字节或千兆字节,请使用标志 --b M--b G

0
投票

试试这个:

file = request.files["file"]
file_size = round(len(file.read()) / 1024, 1) # size in kb
© www.soinside.com 2019 - 2024. All rights reserved.