ファイルをアップロード
- 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(デバッグ =真)