儲存伺服器上傳內容

request.files 中提供了上傳的檔案, MultiDict 對映欄位名稱為檔案物件。如果使用相同的欄位名稱上傳多個檔案,請使用 getlist - 而不是 []get

request.files['profile']  # single file (even if multiple were sent)
request.files.getlist('charts')  # list of files (even if one was sent)

request.files 中的物件有一個 save 方法,可以在本地儲存檔案。建立一個公共目錄以儲存檔案。

filename 屬性是檔案上傳的名稱。這可以由客戶端任意設定,因此通過 secure_filename 方法傳遞它以生成有效且安全的名稱以另存為。 這不能確保名稱是唯一的,因此現有檔案將被覆蓋,除非你執行額外的工作來檢測它。

import os
from flask import render_template, request, redirect, url_for
from werkzeug import secure_filename

# Create a directory in a known location to save files to.
uploads_dir = os.path.join(app.instance_path, 'uploads')
os.makedirs(uploads_dir, exists_ok=True)

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        # save the single "profile" file
        profile = request.files['profile']
        profile.save(os.path.join(uploads_dir, secure_filename(profile.filename)))

        # save each "charts" file
        for file in request.files.getlist('charts'):
            file.save(os.path.join(uploads_dir, secure_filename(file.name)))

        return redirect(url_for('upload'))

    return render_template('upload.html')