使用Python Flask實(shí)現(xiàn)簡(jiǎn)易文件上傳功能
引言
在平時(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)文章希望大家以后多多支持腳本之家!
- 使用Docker部署Python Flask應(yīng)用的完整教程
- Python使用flask作為web服務(wù)器的代碼實(shí)現(xiàn)
- Python使用Flask調(diào)用API接口的方法
- 如何使用?Python?實(shí)現(xiàn)?DeepSeek?R1?本地化部署
- deepseek本地部署及java、python調(diào)用步驟詳解
- 一分鐘帶你上手Python調(diào)用DeepSeek的API
- Python調(diào)用DeepSeek?API的完整操作指南
- Python調(diào)用DeepSeek?API實(shí)現(xiàn)對(duì)本地?cái)?shù)據(jù)庫(kù)的AI管理
- Python使用Flask結(jié)合DeepSeek開(kāi)發(fā)(實(shí)現(xiàn)代碼)
相關(guān)文章
使用python下載大型文件顯示進(jìn)度條和下載時(shí)間的操作代碼
大家都知道下載大型文件時(shí)存在一個(gè)問(wèn)題,那就是內(nèi)存使用量迅速上升,可能會(huì)造成電腦卡死,所以我們需要換一個(gè)方式進(jìn)行下載,這篇文章主要介紹了使用python下載大型文件的方法顯示進(jìn)度條和下載時(shí)間,需要的朋友可以參考下2022-11-11python如何利用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ù)字圖片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python爬蟲(chóng)爬取博客實(shí)現(xiàn)可視化過(guò)程解析
這篇文章主要介紹了Python爬蟲(chóng)爬取博客實(shí)現(xiàn)可視化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Python操作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-06Tornado源碼分析之HTTP服務(wù)請(qǐng)求解析
這篇文章主要為大家介紹了Tornado源碼分析之HTTP服務(wù)請(qǐng)求解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09基于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