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 プロパティは、ブラウザによって報告されるファイル アップロードのコンテンツの長さになりますが、ドキュメントソースに記載されているように、残念ながら多くのブラウザはこれを送信しません。

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 が非常に大きい場合は、メモリに大量のデータを読み込まないように注意してください。

于 2013-04-03T08:38:14.690 に答える
18

最大ファイル アップロード制限を設定する適切な方法は、MAX_CONTENT_LENGTHアプリの構成を使用することです。たとえば、16 メガバイトのアップロード制限を設定する場合は、アプリの構成に対して次の操作を行います。

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 に答える
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 に答える