# Flask實作_ext_14_Flask_Uploads ###### tags: `flask` `flask_ext` `python` `uploads` :::danger 官方文件: * [Flask-wtf](https://flask-wtf.readthedocs.io/en/stable/form.html?highlight=Flask-Uploads#validation) * [Flask_Uploads](https://pythonhosted.org/Flask-Uploads/) ::: `Flask-Uploads`應用於檔案上傳,除了可以直接結合`Flask-wtf`使用之外,還可以限制上傳檔案格式,相信這對初級的檔案上傳應用已經足夠了,使用時要注意到Html文件的設置`enctype=multipart/form-data`以及`<input type=file name=photo>`,透過範例來瞭解吧。 ## 安裝 ```shell pip install flask-uploads ``` ## 範例 ### 參數說明 `Flask_Uploads`的參數設置不多,只提列兩個說明,其餘四個視需求調整即可。 * UPLOADED_FILES_DEST * 檔案上傳放置路徑 * 這部份視專案以及放置文件來看是否需要另外處理 * 也許在`static`內設置一個資料夾放置 * UPLOADED_FILES_URL * 當你需要調用文件時候的連結 * \static\Files\xxxx **注意到上面的『FILES』會依你設置Upload Sets改變** 實作的時候可依需求選擇上傳文件類型,像`IMAGE(.jpg, .jpe, .jpeg, .png, .gif, .svg, and .bmp)`、`TEXT(.txt)`或是`DOCUMENTS(.rtf, .odf, .ods, .gnumeric, .abw, .doc, .docx, .xls, and .xlsx)`,可以全開放再利用`AllExcept`來設置例外禁止清單。 實作的時候透過`UploadSet`設置上傳對象,再利用`configure_uploads`來初始化設置,如同其它擴展的`init_app`,單檔大小限制也可以再使用`patch_request_class`參數配置。 ### 範例 上面的說明非常的抽象,最好的理解方式就是自己動手做它一回,一回生二回熟,錯個幾次就會懂。這個案例是一個取得檔案名稱與檔案連結的說明,為了可以對參數設置有一個較直觀的理解,也故意將參數設置的比較怪異些,請不要介意。 ```python= from flask import Flask from flask_uploads import UploadSet, IMAGES, configure_uploads from flask import request app = Flask(__name__) app.config['SECRET_KEY'] = 'development' app.config['UPLOADED_DEF_DEST'] = r'D:\proPycharm\flask_test\static\image_fold' app.config['UPLOADED_DEF_URL'] = '\\static\\image_fold\\' abc = UploadSet(name='def', extensions=IMAGES) configure_uploads(app, abc) html = ''' <!DOCTYPE html> <html lang="en"> <h1>測試上傳</h1> <form method=post enctype=multipart/form-data> <input type=file name=in_abc> <input type=submit value=Upload> </form> </html> ''' @app.route('/uploads/', methods=['GET', 'POST']) def uploads(): if request.method == 'POST' and 'in_abc' in request.files: filename = abc.save(request.files['in_abc']) print(filename) file_url = abc.url(filename) print(file_url) return html if __name__ == '__main__': app.run(debug=True) ``` 第8、9行:flask_uploads參數設置,注意到,中間是『DEF』,這來自於實作`UploadSet`的參數`name='def'` 第11行:實作`UploadSet` 第12行:初始化`flask_uploads`,這邊是以`UploadSet`跟`app`做參數,故第二個參數為`abc`。 第14行:簡單的設置一個Html 第18行:注意到form設置`enctype=multipart/form-data` 第19行:設置`type=file name=in_abc` 第28行:判斷該`type=file`物件是否存在`request.files` 第29行:利用`save`取得檔案名稱 第31行:利用`url`取得連結路徑(依參數設置) ![](https://i.imgur.com/KL4NS3C.png) ![](https://i.imgur.com/0tOiYNc.png) 檔案名稱會出現_5是因為我上傳了6次(如上圖),當使用者試著上傳非允許格式的時候會拋出異常(如下圖) ![](https://i.imgur.com/y6RAJAS.png) ## 總結 這是一個非常簡單的單檔上傳的案例說明,實作起來不難,只需要注意到該設置的部份正確了就可以了,下一節預計將`flask-uploads`搭配`flask-wtf`一起使用,最後再結合到我們的專案上面去。 **Flask_Uploads_搭配Flask-wtf:**[Flask實作_ext_15_Flask_Uploads_搭配Flask-wtf](https://hackmd.io/s/BJ0Ue_a1m)