ここで注意すべき点がいくつかあります。content_length プロパティは、ブラウザによって報告されるファイル アップロードのコンテンツの長さになりますが、ドキュメントとソースに記載されているように、残念ながら多くのブラウザはこれを送信しません。
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 が非常に大きい場合は、メモリに大量のデータを読み込まないように注意してください。