我想获取上传图片的大小来控制它是否大于最大文件上传限制。我试过这个:
@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']
那样的东西吗?
答案 0 :(得分:32)
这里有一些事情要注意 - content_length属性将是浏览器报告的文件上传的内容长度,但遗憾的是很多浏览器都没有发送这个内容,如docs中所述, source
至于你的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非常大,显然要小心,你不会在内存中读取太多数据
答案 1 :(得分:16)
如果您不想先将文件保存到磁盘,请使用以下代码,这项工作在内存中流
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
答案 2 :(得分:12)
设置最大文件上传限制的正确方法是通过MAX_CONTENT_LENGTH
应用配置。例如,如果要将上载限制设置为16兆字节,则应对应用配置执行以下操作:
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
如果上传的文件太大,Flask将自动返回状态码413请求实体太大 - 这应该在客户端处理。
答案 3 :(得分:4)
以下代码部分应符合您的目的..
form_photo.seek(0,2) size = form_photo.tell()
答案 4 :(得分:1)
正如其他人已经建议的那样,你应该使用
app.config['MAX_CONTENT_LENGTH']
限制文件大小。但 由于您特别希望找出图像大小,您可以执行以下操作:
import os
photo_size = os.stat(request.files['post-photo']).st_size
print photo_size