1. 程式人生 > >Flask-上傳檔案和訪問上傳的檔案

Flask-上傳檔案和訪問上傳的檔案

 1.1.上傳檔案和訪問上傳的檔案

upload_file_demo.py

from flask import Flask,request,render_template
import os
from werkzeug.utils import secure_filename
from flask import send_from_directory

app = Flask(__name__)

#新建images資料夾,UPLOAD_PATH就是images的路徑
UPLOAD_PATH = os.path.join(os.path.dirname(__file__
),'images') @app.route('/upload/',methods=['GET','POST']) def settings(): if request.method == 'GET': return render_template('upload.html') else: desc = request.form.get('desc') avatar = request.files.get('avatar') # 對檔名進行包裝,為了安全,不過對中文的檔名顯示有問題 filename = secure_filename(avatar.filename) avatar.save(os.path.join(UPLOAD_PATH,filename))
print(desc) return '檔案上傳成功' #訪問上傳的檔案 #瀏覽器訪問:http://127.0.0.1:5000/images/django.jpg/ 就可以檢視檔案了 @app.route('/images/<filename>/',methods=['GET','POST']) def get_image(filename): return send_from_directory(UPLOAD_PATH,filename) @app.route('/') def hello_world(): return 'Hello World!
' if __name__ == '__main__': app.run(debug=True)
 

upload.html

<form action="" method="post" enctype="multipart/form-data">
    <table>
        <tbody>
            <tr>
                <td>頭像:</td>
                <td><input type="file" name="avatar"></td>
            </tr>
            <tr>
                <td>描述:</td>
                <td><input type="text" name="desc"></td>
            </tr>
            <tr>
                <td><input type="submit" value="提交"></td>
            </tr>
        </tbody>
    </table>
</form>
 

 

1.2.使用flask-wtf驗證上傳的檔案

forms.py

 
from wtforms import Form,FileField,StringField
from wtforms.validators import InputRequired
from flask_wtf.file import FileRequired,FileAllowed

class UploadForm(Form):
    avatar = FileField(validators=[FileRequired(),       #FileRequired必須上傳
                                   FileAllowed(['jpg','png','gif'])     #FileAllowed:必須為指定的格式的檔案
                                   ])
    desc = StringField(validators=[InputRequired()])
 

upload_file_demo.py

 
from flask import Flask, request, render_template
import os
from werkzeug.utils import secure_filename
from flask import send_from_directory
from forms import UploadForm
from werkzeug.datastructures import CombinedMultiDict

app = Flask(__name__)

# 新建images資料夾,UPLOAD_PATH就是images的路徑
UPLOAD_PATH = os.path.join(os.path.dirname(__file__), 'images')


@app.route('/upload/', methods=['GET', 'POST'])
def settings():
    if request.method == 'GET':
        return render_template('upload.html')
    else:
        # 檔案是從request,files裡面獲取,這裡使用CombinedMultiDict把form和file的資料組合起來,一起驗證
        form = UploadForm(CombinedMultiDict([request.form, request.files]))
        if form.validate():
            desc = request.form.get('desc')
            avatar = request.files.get('avatar')
            # 對檔名進行包裝,為了安全,不過對中文的檔名顯示有問題
            filename = secure_filename(avatar.filename)
            avatar.save(os.path.join(UPLOAD_PATH, filename))
            print(desc)
            return '檔案上傳成功'
        else:
            print(form.errors)
            return "fail"


# 訪問上傳的檔案
# 瀏覽器訪問:http://127.0.0.1:5000/images/django.jpg/  就可以檢視檔案了
@app.route('/images/<filename>/', methods=['GET', 'POST'])
def get_image(filename):
    return send_from_directory(UPLOAD_PATH, filename)


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run(debug=True)
 

 

 1.1.上傳檔案和訪問上傳的檔案

upload_file_demo.py

from flask import Flask,request,render_template
import os
from werkzeug.utils import secure_filename
from flask import send_from_directory

app = Flask(__name__)

#新建images資料夾,UPLOAD_PATH就是images的路徑
UPLOAD_PATH = os.path.join(os.path.dirname(__file__),'images')

@app.route('/upload/',methods=['GET','POST'])
def settings():
    if request.method == 'GET':
        return render_template('upload.html')
    else:
        desc = request.form.get('desc')
        avatar = request.files.get('avatar')
        # 對檔名進行包裝,為了安全,不過對中文的檔名顯示有問題
        filename = secure_filename(avatar.filename)
        avatar.save(os.path.join(UPLOAD_PATH,filename))
        print(desc)
        return '檔案上傳成功'

#訪問上傳的檔案
#瀏覽器訪問:http://127.0.0.1:5000/images/django.jpg/  就可以檢視檔案了
@app.route('/images/<filename>/',methods=['GET','POST'])
def get_image(filename):
    return send_from_directory(UPLOAD_PATH,filename)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(debug=True)
 

upload.html

<form action="" method="post" enctype="multipart/form-data">
    <table>
        <tbody>
            <tr>
                <td>頭像:</td>
                <td><input type="file" name="avatar"></td>
            </tr>
            <tr>
                <td>描述:</td>
                <td><input type="text" name="desc"></td>
            </tr>
            <tr>
                <td><input type="submit" value="提交"></td>
            </tr>
        </tbody>
    </table>
</form>
 

 

1.2.使用flask-wtf驗證上傳的檔案

forms.py

 
from wtforms import Form,FileField,StringField
from wtforms.validators import InputRequired
from flask_wtf.file import FileRequired,FileAllowed

class UploadForm(Form):
    avatar = FileField(validators=[FileRequired(),       #FileRequired必須上傳
                                   FileAllowed(['jpg','png','gif'])     #FileAllowed:必須為指定的格式的檔案
                                   ])
    desc = StringField(validators=[InputRequired()])
 

upload_file_demo.py

 
from flask import Flask, request, render_template
import os
from werkzeug.utils import secure_filename
from flask import send_from_directory
from forms import UploadForm
from werkzeug.datastructures import CombinedMultiDict

app = Flask(__name__)

# 新建images資料夾,UPLOAD_PATH就是images的路徑
UPLOAD_PATH = os.path.join(os.path.dirname(__file__), 'images')


@app.route('/upload/', methods=['GET', 'POST'])
def settings():
    if request.method == 'GET':
        return render_template('upload.html')
    else:
        # 檔案是從request,files裡面獲取,這裡使用CombinedMultiDict把form和file的資料組合起來,一起驗證
        form = UploadForm(CombinedMultiDict([request.form, request.files]))
        if form.validate():
            desc = request.form.get('desc')
            avatar = request.files.get('avatar')
            # 對檔名進行包裝,為了安全,不過對中文的檔名顯示有問題
            filename = secure_filename(avatar.filename)
            avatar.save(os.path.join(UPLOAD_PATH, filename))
            print(desc)
            return '檔案上傳成功'
        else:
            print(form.errors)
            return "fail"


# 訪問上傳的檔案
# 瀏覽器訪問:http://127.0.0.1:5000/images/django.jpg/  就可以檢視檔案了
@app.route('/images/<filename>/', methods=['GET', 'POST'])
def get_image(filename):
    return send_from_directory(UPLOAD_PATH, filename)


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run(debug=True)