Flask: Get the size of request.files object

Question:

I want to get the size of uploading image to control if it is greater than max file upload limit. I tried this one:

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

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

It printed 0. What am I doing wrong? Should I find the size of this image from the temp path of it? Is there anything like PHP’s $_FILES['foo']['size'] in Python?

Asked By: saidozcan

||

Answers:

The proper way to set a max file upload limit is via the MAX_CONTENT_LENGTH app configuration. For example, if you wanted to set an upload limit of 16 megabytes, you would do the following to your app configuration:

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

If the uploaded file is too large, Flask will automatically return status code 413 Request Entity Too Large – this should be handled on the client side.

Answered By: Michael Pratt

As someone else already suggested, you should use the

app.config['MAX_CONTENT_LENGTH'] 

to restrict file sizes. But
Since you specifically want to find out the image size, you can do:

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

There are a few things to be aware of here – the content_length property will be the content length of the file upload as reported by the browser, but unfortunately many browsers dont send this, as noted in the docs and source.

As for your TypeError, the next thing to be aware of is that file uploads under 500KB are stored in memory as a StringIO object, rather than spooled to disk (see those docs again), so your stat call will fail.

MAX_CONTENT_LENGTH is the correct way to reject file uploads larger than you want, and if you need it, the only reliable way to determine the length of the data is to figure it out after you’ve handled the upload – either stat the file after you’ve .save()d it:

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

Or if you’re not using the disk (for example storing it in a database), count the bytes you’ve read:

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

Though obviously be careful you’re not reading too much data into memory if your MAX_CONTENT_LENGTH is very large

Answered By: DazWorrall

If you don’t want save the file to disk first, use the following code, this work on in-memory stream

import os

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

otherwise, this will better

request.files['file'].save('/tmp/file')
file_length = os.stat('/tmp/file').st_size
Answered By: Steely Wing

The following section of the code should meet your purpose..


form_photo.seek(0,2)
size = form_photo.tell()

Answered By: Aniket

You can go by popen from os import

save it first

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

now, just get the size

os.popen('ls -l tmp | cut -d " " -f5').read()
  • this in bytes
  • for Megabytes or Gigabytes, use the flag –b M or –b G
Answered By: PYK
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.