29

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

@app.route("/new/photo",methods=["POST"])
def newPhoto():

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

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

4

6 回答 6

46

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

至于您的 TypeError,接下来要注意的是,上传的 500KB 以下的文件作为StringIO object存储在内存中,而不是假脱机到磁盘(再次参见那些文档),因此您的 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 非常大,您不会将太多数据读入内存

于 2013-04-03T08:38:14.690 回答
35

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

import os

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

否则,这会更好

request.files['file'].save('/tmp/file')
file_length = os.stat('/tmp/file').st_size
于 2014-05-12T04:25:46.567 回答
18

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

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

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

于 2013-04-02T19:51:41.440 回答
5

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

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

于 2016-05-04T15:32:49.967 回答
2

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

app.config['MAX_CONTENT_LENGTH'] 

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

import os
photo_size = os.stat(request.files['post-photo']).st_size
print photo_size
于 2013-04-02T20:32:06.507 回答
0

您可以从os import使用popen

先保存

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

现在,只需获取尺寸

os.popen('ls -l tmp | cut -d " " -f5').read()
  • 这以字节为单位
  • 对于兆字节或千兆字节,使用标志--b M--b G
于 2021-11-18T21:37:32.440 回答