最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python Flask實現(xiàn)簡易文件上傳功能

 更新時間:2024年05月16日 09:24:03   作者:輕松運維小豬  
在平時工作中,文件上傳是一項常見的需求,例如將應用異常時通過腳本生成的dump文件收集起來進行分析,但實現(xiàn)起來卻可能相當復雜,在本文中,我們將探討如何使用Flask實現(xiàn)文件上傳功能,編寫Dockerfile將應用程序通過docker部署,需要的朋友可以參考下

引言

在平時工作中,文件上傳是一項常見的需求,例如將應用異常時通過腳本生成的dump文件收集起來進行分析,但實現(xiàn)起來卻可能相當復雜。幸運的是,F(xiàn)lask框架提供了一種簡單而高效的方式來處理文件上傳,代碼不到100行。在本文中,我們將探討如何使用Flask實現(xiàn)文件上傳功能,編寫Dockerfile將應用程序通過docker部署。

Flask 文件上傳流程

Flask文件上傳的基本流程包括以下幾個步驟:

  • 創(chuàng)建一個帶有 enctype=multipart/form-data 屬性的 <form> 表單,并在其中放置一個 <input type=file> 元素。
  • 應用程序通過請求對象的 files 字典訪問文件。
  • 使用文件的 save() 方法將文件保存到文件系統(tǒng)的某個位置。

實現(xiàn)文件上傳

以下是使用Flask實現(xiàn)文件上傳的示例代碼:

import os
from flask import Flask, flash, request, redirect, url_for, send_from_directory
from werkzeug.utils import secure_filename

UPLOAD_FOLDER = '/data/file_server/upload/'  # 上傳文件存儲的路徑
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'pcap'}  # 允許上傳的文件擴展名

app = Flask(__name__)
app.secret_key = '3ccfa213427578f707a015a87c5f94959df16cfd'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# 檢查文件擴展名是否合法
def allowed_file(filename):
    return '.' in filename and \
    filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

# 上傳文件并重定向用戶到上傳后的文件URL
@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        # 檢查請求中是否包含文件部分
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        # 如果用戶沒有選擇文件,瀏覽器也會提交一個沒有文件名的空文件
        if file.filename == '':
            flash('No selected file')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return redirect(url_for('uploaded_file', filename=filename))
    return '''
    <!doctype html>
    <title>Upload new File</title>
    <h1>Upload new File</h1>
    <form method=post enctype=multipart/form-data>
      <input type=file name=file>
      <input type=submit value=Upload>
    </form>
    '''

# 提供已上傳文件的下載鏈接
@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)

if __name__ == '__main__':
    from waitress import serve
    serve(app, host="0.0.0.0", port=9090)

安全性考量

在處理文件上傳時,安全性是一個重要的考慮因素。例如,我們不希望用戶能夠上傳任何文件類型,因為這可能導致跨站腳本攻擊(XSS)或其他安全問題。因此代碼邏輯加上限制允許上傳的文件擴展名后綴。
另外對于上傳文件的文件名也是需要考慮的,secure_filename() 函數(shù)用于確保文件名的安全,防止路徑穿越攻擊。該函數(shù)會移除文件名中的路徑信息,只保留有效的文件名部分。不過由于secure_filename函數(shù)獲取中文文件名時,中文會被省略,所以文件名都要使用英文格式。

限制上傳文件大小

Flask 默認情況下會接受任意大小的文件上傳,但可以通過設(shè)置 MAX_CONTENT_LENGTH 配置鍵來限制最大允許的文件大?。?/p>

app.config['MAX_CONTENT_LENGTH'] = 16 * 1000 * 1000  # 限制為16MB

一般會搭配nginx反向代理來使用,可以通過Nginx的 client_max_body_size 指令控制上傳文件大小。

Docker部署應用

編寫Dockerfile

FROM python:3

WORKDIR /app/fileserver

RUN pip install flask Werkzeug waitress --index-url http://mirrors.cloud.aliyuncs.com/pypi/simple/ --trusted-host mirrors.cloud.aliyuncs.com

COPY fs.py ./

CMD [ "python", "./fs.py" ]

構(gòu)建鏡像

docker build -t flask-upload-app .

啟動容器

docker run -d --name flask-upload-app -v /data/file_server/upload/:/data/file_server/upload/ -p 9090:9090 flask-upload-app

配置Nginx反向代理

server {
    listen       31503 ;
    # flask上傳    
    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://localhost:9090/;
    }
}

測試上傳

結(jié)語

通過上述步驟,你可以編寫Flask應用輕松實現(xiàn)文件上傳功能,希望對大家有所幫助。

到此這篇關(guān)于使用Python Flask實現(xiàn)簡易文件上傳功能的文章就介紹到這了,更多相關(guān)Python Flask文件上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

桂林市| 辽宁省| 阿坝| 西乌珠穆沁旗| 德州市| 渭南市| 潮州市| 高陵县| 夹江县| 都昌县| 延吉市| 宿松县| 玛多县| 恩平市| 延庆县| 乐昌市| 南郑县| 达孜县| 平陆县| 平江县| 和平县| 叙永县| 竹北市| 金坛市| 高淳县| 昭觉县| 惠来县| 嘉鱼县| 柳河县| 东城区| 兴义市| 通城县| 盐山县| 田林县| 凤冈县| 漳州市| 志丹县| 繁昌县| 新源县| 金寨县| 贵港市|