Try   HackMD

Flask實作_ext_14_Flask_Uploads

tags: flask flask_ext python uploads

官方文件:

Flask-Uploads應用於檔案上傳,除了可以直接結合Flask-wtf使用之外,還可以限制上傳檔案格式,相信這對初級的檔案上傳應用已經足夠了,使用時要注意到Html文件的設置enctype=multipart/form-data以及<input type=file name=photo>,透過範例來瞭解吧。

安裝

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參數配置。

範例

上面的說明非常的抽象,最好的理解方式就是自己動手做它一回,一回生二回熟,錯個幾次就會懂。這個案例是一個取得檔案名稱與檔案連結的說明,為了可以對參數設置有一個較直觀的理解,也故意將參數設置的比較怪異些,請不要介意。

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,這邊是以UploadSetapp做參數,故第二個參數為abc
第14行:簡單的設置一個Html
第18行:注意到form設置enctype=multipart/form-data
第19行:設置type=file name=in_abc
第28行:判斷該type=file物件是否存在request.files
第29行:利用save取得檔案名稱
第31行:利用url取得連結路徑(依參數設置)



檔案名稱會出現_5是因為我上傳了6次(如上圖),當使用者試著上傳非允許格式的時候會拋出異常(如下圖)

總結

這是一個非常簡單的單檔上傳的案例說明,實作起來不難,只需要注意到該設置的部份正確了就可以了,下一節預計將flask-uploads搭配flask-wtf一起使用,最後再結合到我們的專案上面去。

Flask_Uploads_搭配Flask-wtf:Flask實作_ext_15_Flask_Uploads_搭配Flask-wtf