使用python的Flask框架進(jìn)行上傳和下載文件詳解
send_file()函數(shù):
def send_file(
path_or_file: t.Union[os.PathLike, str, t.BinaryIO],
mimetype: t.Optional[str] = None,
as_attachment: bool = False,
download_name: t.Optional[str] = None,
attachment_filename: t.Optional[str] = None,
conditional: bool = True,
etag: t.Union[bool, str] = True,
add_etags: t.Optional[bool] = None,
last_modified: t.Optional[t.Union[datetime, int, float]] = None,
max_age: t.Optional[
t.Union[int, t.Callable[[t.Optional[str]], t.Optional[int]]]
] = None,
cache_timeout: t.Optional[int] = None,
):參數(shù)解析:
- path_or_file:要發(fā)送的文件的路徑,如果給出了相對(duì)路徑,則相對(duì)于當(dāng)前工作目錄?;蛘?,以二進(jìn)制模式打開(kāi)的類文件對(duì)象。確保將文件指針查找到數(shù)據(jù)的開(kāi)頭。
- mimetype:為文件發(fā)送的MIME類型。如果沒(méi)有提供,它將嘗試從文件名檢測(cè)它。
- as_attachment:指示瀏覽器應(yīng)該提供給保存文件而不是顯示它。
- download_name:瀏覽器保存文件時(shí)使用的默認(rèn)名稱。默認(rèn)為傳遞的文件名。
- conditional:基于請(qǐng)求頭啟用條件響應(yīng)和范圍響應(yīng)。需要傳遞一個(gè)文件路徑和``environ``。
- etag:計(jì)算文件的etag,這需要傳遞一個(gè)文件路徑。也可以是字符串來(lái)代替。
- last_modified:發(fā)送文件的最后修改時(shí)間,單位為秒。如果沒(méi)有提供,它將嘗試從文件路徑檢測(cè)它。
- max_age:客戶端應(yīng)該緩存文件多長(zhǎng)時(shí)間,以秒為單位。如果設(shè)置,' ' Cache-Control ' '將為' ' public ' ',否則將為' ' no-cache ' '以選擇條件緩存。
注意:

示例代碼:
import os
from flask import Flask, send_file, request, render_template, redirect
from werkzeug.utils import secure_filename
app = Flask(__name__)
UPLOAD_FOLDER = 'media' # 注意:要提前在根目錄下新建media文件,否則會(huì)報(bào)錯(cuò)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 判斷上傳的文件是否是允許的后綴
def allowed_file(filename):
return "." in filename and filename.rsplit('.', 1)[1].lower() in set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
@app.route('/')
def index():
return "hello world!"
@app.route('/generate_file')
def generate_file():
with open('./new_file.txt', 'w', encoding='utf-8') as f:
f.write('我是new_file.txt文件!')
return "<./new_file.txt>文件已經(jīng)生成!"
@app.route('/download')
def download():
return send_file('./new_file.txt', as_attachment=True)
@app.route('/upload', methods=['GET', 'POST'])
def upload():
if request.method == 'GET':
return render_template('upload.html')
else:
if "file" not in request.files:
return redirect(request.url)
file = request.files.get('file') # 獲取文件
# 上傳空文件(無(wú)文件)
if file.filename == '':
return redirect(request.url)
if file and allowed_file(file.filename):
if not os.path.exists(f'./templates/{UPLOAD_FOLDER}'):
os.mkdir(f'./templates/{UPLOAD_FOLDER}')
filename = secure_filename(file.filename) # 用這個(gè)函數(shù)確定文件名稱是否是安全 (注意:中文不能識(shí)別)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) # 保存文件
return "上傳文件成功!"
if __name__ == '__main__':
app.run()下載和上傳路徑中可以添加用戶身份驗(yàn)證:
import os
from flask import Flask, send_file, request, render_template, redirect
from werkzeug.utils import secure_filename
app = Flask(__name__)
UPLOAD_FOLDER = 'media' # 注意:要提前在根目錄下新建media文件,否則會(huì)報(bào)錯(cuò)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
allow_users = ['dgw', 'super_user']
# 判斷上傳的文件是否是允許的后綴
def allowed_file(filename):
return "." in filename and filename.rsplit('.', 1)[1].lower() in set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
@app.route('/')
def index():
return "hello world!"
@app.route('/generate_file')
def generate_file():
with open('./new_file.txt', 'w', encoding='utf-8') as f:
f.write('我是new_file.txt文件!')
return "<./new_file.txt>文件已經(jīng)生成!"
@app.route('/download')
def download():
user_name = request.args.get('user_name')
if not user_name:
return "你沒(méi)有權(quán)限下載文件!"
if user_name and user_name not in allow_users:
return "你沒(méi)有權(quán)限下載文件!"
return send_file('./new_file.txt', as_attachment=True)
@app.route('/upload/<string:user_name>', methods=['GET', 'POST'])
def upload(user_name):
if request.method == 'GET':
if user_name not in allow_users:
return "您沒(méi)有權(quán)限訪問(wèn)此頁(yè)面!"
return render_template('upload.html')
else:
if user_name not in allow_users:
return "您沒(méi)有權(quán)限訪問(wèn)此頁(yè)面!"
if "file" not in request.files:
return redirect(request.url)
file = request.files.get('file') # 獲取文件
# 上傳空文件(無(wú)文件)
if file.filename == '':
return redirect(request.url)
if file and allowed_file(file.filename):
if not os.path.exists(f'./templates/{UPLOAD_FOLDER}'):
os.mkdir(f'./templates/{UPLOAD_FOLDER}')
filename = secure_filename(file.filename) # 用這個(gè)函數(shù)確定文件名稱是否是安全 (注意:中文不能識(shí)別)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) # 保存文件
return "上傳文件成功!"
if __name__ == '__main__':
app.run()附錄:
upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Upload</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上傳">
</form>
</body>
</html>到此這篇關(guān)于使用python的Flask框架進(jìn)行上傳和下載文件詳解的文章就介紹到這了,更多相關(guān)python的Flask框架上傳下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Python實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整代碼
不知道大家是否曾體驗(yàn)過(guò)打飛機(jī)的樂(lè)趣,或者是否曾與朋友們一起較量過(guò)這款游,這篇文章主要介紹了用Python實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整代碼,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-11-11
Python無(wú)法安裝包的一種解決(Requirement already satisfied問(wèn)題)
這篇文章主要介紹了Python無(wú)法安裝包的一種解決(Requirement already satisfied問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Python數(shù)據(jù)分析基礎(chǔ)之異常值檢測(cè)和處理方式
這篇文章主要介紹了Python數(shù)據(jù)分析基礎(chǔ)之異常值檢測(cè)和處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
TensorFlow實(shí)現(xiàn)簡(jiǎn)單的CNN的方法
這篇文章主要介紹了TensorFlow實(shí)現(xiàn)簡(jiǎn)單的CNN的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python?matplotlib?seaborn繪圖教程詳解
Seaborn是在matplotlib的基礎(chǔ)上進(jìn)行了更高級(jí)的API封裝,從而使得作圖更加容易,在大多數(shù)情況下使用seaborn就能做出很具有吸引力的圖。本文將詳細(xì)講解如何利用Seaborn繪制圖表,需要的可以參考一下2022-03-03
Python腳本如何在bilibili中查找彈幕發(fā)送者
這篇文章主要介紹了如何在bilibili中查找彈幕發(fā)送者,本文給大家分享小編寫(xiě)的一個(gè)python腳本來(lái)實(shí)現(xiàn)bilibili彈幕發(fā)送者,需要的朋友可以參考下2020-06-06

