# 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)