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

sai*_*can 20 python flask

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

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

    form_photo = request.files['post-photo']
    print form_photo.content_length
Run Code Online (Sandbox Code Playgroud)

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

Daz*_*all 34

这里有一些需要注意的事项 - content_length属性将是浏览器报告的文件上传的内容长度,但不幸的是很多浏览器都没有发送它,如文档源中所述.

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

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

request.files['file'].save('/tmp/foo')
size = os.stat('/tmp/foo').st_size
Run Code Online (Sandbox Code Playgroud)

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

blob = request.files['file'].read()
size = len(blob)
Run Code Online (Sandbox Code Playgroud)

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

  • http://stackoverflow.com/a/23601025/125507 不是更好吗?只是寻找到文件的末尾并且您没有使用任何内存? (2认同)

Ste*_*ing 18

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

import os

file = request.files['file']
file.seek(0, os.SEEK_END)
file_length = file.tell()
Run Code Online (Sandbox Code Playgroud)

否则,这会更好

request.files['file'].save('/tmp/file')
file_length = os.stat('/tmp/file').st_size
Run Code Online (Sandbox Code Playgroud)

  • 警告:如果您在使用上面的“file.seek(0, os.SEEK_END)”选项后尝试保存上传的文件,您上传的文件将被损坏,或者更确切地说它将是一个空文件。获得 file_length 值后,添加以下内容:“file.seek(0, 0)” (6认同)
  • `file.seek(0, 2)` 应该在不导入 `os` 的情况下做同样的事情?http://stackoverflow.com/a/283719/125507 从文件末尾寻找 0 个字节 (2认同)

Mic*_*att 12

设置最大文件上载限制的正确方法是通过MAX_CONTENT_LENGTH应用程序配置.例如,如果要将上载限制设置为16兆字节,则应对应用配置执行以下操作:

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
Run Code Online (Sandbox Code Playgroud)

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


小智 5

代码的以下部分应该符合您的目的..

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