# 文件上傳筆記:
1. 在模版中,form表單中,須要指定`encotype='multipart/form-data'`才能上傳文件。
2. 在後臺若是想要獲取上傳的文件,那麼應該使用`request.files.get('avatar')`來獲取。
3. 保存文件以前,先要使用`werkzeug.utils.secure_filename`來對上傳上來的文件名進行一個過濾。這樣才能保證不會有安全問題。
4. 獲取到上傳上來的文件後,使用`avatar.save(路徑)`方法來保存文件。、
5. 從服務器上讀取文件,應該定義一個url與視圖函數,來獲取指定的文件。在這個視圖函數中,使用`send_from_directory(文件的目錄,文件名)`來獲取。
示例代碼以下:
html
1 # coding:utf-8 2 from flask import Flask, request, render_template, send_from_directory 3 import os 4 from werkzeug.utils import secure_filename 5 6 app = Flask(__name__) 7 8 dirpath = os.path.dirname(__file__) 9 10 11 @app.route('/') 12 def hello_world(): 13 return 'Hello World!' 14 15 16 @app.route('/upload/', methods=['GET', 'POST']) 17 def upload(): 18 if request.method == 'GET': 19 return render_template('upload.html') 20 else: 21 # 獲取描述信息 22 desc = request.form.get('desc') 23 avatar = request.files.get('avatar') 24 avatar.save(os.path.join(dirpath+'\\images', avatar.filename)) 25 print desc 26 return "file upload success." 27 28 29 @app.route('/images/<filename>/') 30 def get_image(filename): 31 return send_from_directory(dirpath+"\\images", filename) 32 33 if __name__ == '__main__': 34 app.run(debug=True)
### 對上傳文件使用表單驗證:
1. 定義表單的時候,對文件的字段,須要採用`FileField`這個類型。
2. 驗證器應該從`flask_wtf.file`中導入。`flask_wtf.file.FileRequired`是用來驗證文件上傳是否爲空。`flask_wtf.file.FileAllowed`用來驗證上傳的文件的後綴名。
3. 在視圖文件中,使用`from werkzeug.datastructures import CombinedMultiDict`來把`request.form`與`request.files`來進行合併。再傳給表單來驗證。
示例代碼以下:flask
1 from werkzeug.datastructures import CombinedMultiDict 2 form = UploadForm(CombinedMultiDict([request.form,request.files]))