フラスコ注:ファイルのアップロード

ファイルをアップロード

  • ENCTYPE: HTMLフォームフォームのformタグのデフォルトでは、 `ENCTYPE = "アプリケーション/ x軸 www-form-urlencodedで返します"`、 ファイルのアップロードがENCTYPE ="マルチパート/フォーム- `に設定する必要があり 、データ"`、 それ以外のファイルアップロードは成功しません。
  • アップロードファイルの背景を取得します。 fileobjを= request.files.get(「input_file_name」)を、パラメータ取得の方法は、HTMLファイル入力タグは、name属性の値ではなく、アップロードするファイル名を指定していることに注意すること。
  • ファイル名の取り扱い:使用fileobj.filenameは、ファイル名を取得するのではなく、直接ファイル名の使用を推奨していません、セキュリティ上の理由から、werkzeug.utilsがそれを処理するためsecure_filenameファイル名フィルタをインポートから使用することをお勧めします。
  • ファイル保存:、fileobj.save(FILE_PATH)に返されたファイルオブジェクトを使用しての保存方法を、FILE_PATHは、ファイルを保存するための絶対パスです。
  • ブラウザにファイルを送信する:、フラスコインポートsend_from_directoryから使用し、対応するファイルに直接戻る、send_from_directoryは、2つのパラメータを必要とし、最初のパラメータは、ファイルのディレクトリで、2番目のパラメータはファイル名です。

 

ファイルの検証

  • フォームの検証:検証wtformsインポートフォームからサブクラスを使用。
  • フィールドタイプ: WTFormsインポートFileFieldにからは、ファイルの種類をFileFieldに。
  • Validatorは:インポートFileRequired、FileAllowed flask_wtf.fileから、FileRequiredはFileAllowedは、ファイル拡張子の種類を示し、ファイルは空にすることはできませんことを示しています。
  • 多要素の組み合わせは:ファイル、テキストやその他の要素の多くの種類があります要求、などではない、同時に方法で、リクエストから取得したデータ、:のRequest.Formとrequest.filesし、フォームオブジェクトのフォームの検証を使用する場合、私たちは、さまざまな要素を結合しますwerkzeug.datastructuresインポートCombinedMultiDictから使用して、確認するために、フォームオブジェクトを渡す必要があります。
  • データ収集:フォームオブジェクト後に検証した後、そのようなテキストファイルとして、この方法で「形[ATTR_NAME] .DATA」方式、及び同じである要求によって取得されたデータによってデータを得ることができます。

 

簡単な例:

メインコードupload.html HTMLファイル

 < フォームアクション= "" 方法= "POST" のenctype = "マルチパート/フォームデータ" > 
        < > 
            < TBODY > 
                < TR > 
                    < TD >头像:</ TD > 
                    < TD > < 入力タイプ= "ファイル" = "アバター" > </ TD > 
                </ TR > 
                < TR > 
                    < TD >描述:</ TD >
                    < TD > < 入力タイプ= "テキスト" 名前= "DESC" > </ TD > 
                </ TR > 
                < TR > 
                    < TD > </ TD > 
                    < TD > < 入力タイプ= "提出" = "提交" > </ TD > 
                < / TR > 
            </ TBODY > 
        </ テーブル> 
    </ フォーム>

ブラウザの効果

Formオブジェクトファイルforms.py

WTForms インポートをForm1、FileFieldに、StringField
 から wtforms.validators インポートInputRequired
 から flask_wtf.file インポートFileRequired、FileAllowedの


クラスUploadFileForm(Form1の):
    FileFieldにフィールドファイルタイプを示す 
    アバターFileFieldに(バリ= [FileRequiredを()=を、FileAllowed([ ' JPG ' ' PNG ' ' GIF ' ])])
    文字列型を表すStringFieldフィールド 
    DESC = StringField(バリ= [InputRequired ()])を

 

 メインPYファイル

インポートOS
 から werkzeug.utilsがインポートsecure_filename
 から werkzeug.datastructuresがインポートCombinedMultiDictを
 からフラスコインポートsend_from_directoryフラスコ、要求、render_template、
 からフォームインポートUploadFileForm 

アプリ =フラスコ(__name__ 

所有图片文件放在根目录的画像文件夹下 
UPLOAD_PATH = OS .path.join(os.path.dirname(__FILE__)、' 画像' 


app.route @(' / /アップロード'、メソッド= [ ' GET' ' POST ' ])
 DEF (アップロード):
     IF request.method == ' GET ' 戻り render_template(' upload.htmlを' #は、フォームのフォーム要素のバインディングリクエスト複数 
        形= UploadFileForm(CombinedMultiDict([ Request.Form、request.FILES]))
         IF )(form.validate:
            は、対応するHTMLタグのname属性に応じて、アップロードされた対応するデータを取得
            #の辞書へのRequest.Form相当
            #1 DESC = request.form.get(「DESCを「) 
            DESC =form.desc.data
             印刷(DESC)
            request.filesからファイルを取得する必要があり得る
            。#アバター= request.files.get(「アバター」) 
            アバター= form.avatar.data
             安全のために、あなたは特別なファイル名を使用する必要があります途中で(secure_filename機能)フィルタリング
            #の中国の支援のためのsecure_filenameは非常に良いではありません、あなたはファイル名を変換し、まだ何に対処するために、この機能を使用することをお勧めすることができ 
            、ファイル名= secure_filename(avatar.filename)
            直接によって返されたファイルオブジェクトそれが入ってくるパスを保存する方法、セーブ、パスは相対パスにすることはできません、絶対パスが必要とされて
            avatar.save(os.path.join(upload_path、ファイル名))
             のリターン " ファイルが正常にアップロード!
        印刷(form.errors)
            リターン " ファイルのアップロードに失敗しました!


App.route @(/ / RFロイヤリティーフリー/ <ファイル名> " DEFのGET_IMAGE(ファイル名):
    send_from_directory使用してブラウザにファイルを取得するには、最初のパラメータは、ファイルのディレクトリで、2番目のパラメータは、ファイル名で
    復帰send_from_directory(upload_path、ファイル名)


IF  __name__ == ' __main__ ' 
    app.run(デバッグ =真)

 

おすすめ

転載: www.cnblogs.com/guyuyun/p/11223447.html