欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

引言

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

Flask 文件上傳流程

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

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

實(shí)現(xiàn)文件上傳

以下是使用Flask實(shí)現(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/'  # 上傳文件存儲(chǔ)的路徑
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'pcap'}  # 允許上傳的文件擴(kuò)展名

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

# 檢查文件擴(kuò)展名是否合法
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':
        # 檢查請(qǐng)求中是否包含文件部分
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        # 如果用戶沒(méi)有選擇文件,瀏覽器也會(huì)提交一個(gè)沒(méi)有文件名的空文件
        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)

安全性考量

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

限制上傳文件大小

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

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

一般會(huì)搭配nginx反向代理來(lái)使用,可以通過(guò)Nginx的 client_max_body_size 指令控制上傳文件大小。

Docker部署應(yīng)用

編寫(xiě)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 .

啟動(dòng)容器

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/;
    }
}

測(cè)試上傳

結(jié)語(yǔ)

通過(guò)上述步驟,你可以編寫(xiě)Flask應(yīng)用輕松實(shí)現(xiàn)文件上傳功能,希望對(duì)大家有所幫助。

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

相關(guān)文章

  • 使用python下載大型文件顯示進(jìn)度條和下載時(shí)間的操作代碼

    使用python下載大型文件顯示進(jìn)度條和下載時(shí)間的操作代碼

    大家都知道下載大型文件時(shí)存在一個(gè)問(wèn)題,那就是內(nèi)存使用量迅速上升,可能會(huì)造成電腦卡死,所以我們需要換一個(gè)方式進(jìn)行下載,這篇文章主要介紹了使用python下載大型文件的方法顯示進(jìn)度條和下載時(shí)間,需要的朋友可以參考下
    2022-11-11
  • Python正則表達(dá)式re.sub()用法詳解

    Python正則表達(dá)式re.sub()用法詳解

    re.sub用于替換字符串中的匹配項(xiàng),下面這篇文章主要給大家介紹了關(guān)于Python正則表達(dá)式re.sub()用法的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • python如何利用matplotlib繪制并列雙柱狀圖并標(biāo)注數(shù)值

    python如何利用matplotlib繪制并列雙柱狀圖并標(biāo)注數(shù)值

    Python之中最好的圖表庫(kù)叫matplotlib,matplotlib,顧名思義就是提供了一整套和matlab相似的API,它的文檔相當(dāng)完備,下面這篇文章主要給大家介紹了關(guān)于python如何利用matplotlib繪制并列雙柱狀圖并標(biāo)注數(shù)值的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • 詳解如何從TensorFlow的mnist數(shù)據(jù)集導(dǎo)出手寫(xiě)體數(shù)字圖片

    詳解如何從TensorFlow的mnist數(shù)據(jù)集導(dǎo)出手寫(xiě)體數(shù)字圖片

    這篇文章主要介紹了詳解如何從TensorFlow的mnist數(shù)據(jù)集導(dǎo)出手寫(xiě)體數(shù)字圖片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python爬蟲(chóng)爬取博客實(shí)現(xiàn)可視化過(guò)程解析

    Python爬蟲(chóng)爬取博客實(shí)現(xiàn)可視化過(guò)程解析

    這篇文章主要介紹了Python爬蟲(chóng)爬取博客實(shí)現(xiàn)可視化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python操作JSON實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)交換

    Python操作JSON實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)交換

    這篇文章主要介紹了Python操作JSON實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)交換,JSON的全稱是 JavaScript Object Notation,是一種輕量級(jí)的數(shù)據(jù)交換格式,關(guān)于JSON的更多相關(guān)內(nèi)容感興趣的小伙伴可以參考一下
    2022-06-06
  • Tornado源碼分析之HTTP服務(wù)請(qǐng)求解析

    Tornado源碼分析之HTTP服務(wù)請(qǐng)求解析

    這篇文章主要為大家介紹了Tornado源碼分析之HTTP服務(wù)請(qǐng)求解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Python第三方庫(kù)安裝緩慢的解決方法

    Python第三方庫(kù)安裝緩慢的解決方法

    這篇文章主要給大家介紹了關(guān)于Python第三方庫(kù)安裝緩慢的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 基于Python輕松制作一個(gè)股票K線圖網(wǎng)站

    基于Python輕松制作一個(gè)股票K線圖網(wǎng)站

    在當(dāng)今這個(gè)人手一個(gè)?Web?服務(wù)的年代,GUI?程序還是沒(méi)有?Web?服務(wù)來(lái)的香啊。所以本文將用Python制作一個(gè)簡(jiǎn)單的股票K線圖網(wǎng)站,感興趣的可以了解一下
    2022-09-09
  • Python實(shí)現(xiàn)分段線性插值

    Python實(shí)現(xiàn)分段線性插值

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)分段線性插值,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評(píng)論