启用下载的路由规则不包含文件名。这意味着不能将任何参数传递给路由。请参阅variable rules 的文档。
然后在呈现模板时由url_for 创建该网址。
我还建议使用send_from_directory 函数。
import os
from glob import glob
from flask import Flask, flash, request, redirect, send_from_directory, url_for
from werkzeug.utils import secure_filename
ALLOWED_EXTENSIONS = {'wav'}
app = Flask(__name__)
app.secret_key = 'your secret here'
app.config['UPLOAD_FOLDER'] = os.path.join(app.static_folder, 'uploads')
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/', methods=['GET', 'POST'])
def index():
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))
path = app.config['UPLOAD_FOLDER']
files = [file[len(path)+1:] for file in glob(os.path.join(path, '*.wav'))]
return render_template('index.html', files=files)
@app.route('/download/<path:filename>')
def download(filename):
path = app.config['UPLOAD_FOLDER']
return send_from_directory(
path,
filename,
as_attachment=True,
mimetype='audio/wav'
)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" />
</form>
<ul>
{% for filename in files %}
<li>
<audio controls>
<source src="{{ url_for('download', filename=filename) }}" type="audio/wav">
</audio>
{% endfor %}
</li>
</ul>
</body>
</html>
如果您只想提供一个刚刚上传的音频文件供您收听,则必须稍微修改示例。
请记住,只有刚刚上传的文件才能被识别。为了稍后再次访问该文件,需要文件名。因此,在上面的示例中,我列出了文件夹中的所有文件。
@app.route('/', methods=['GET', 'POST'])
def index():
filename = None
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 render_template('index.html', filename=filename)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" />
</form>
{% if filename %}
<audio controls>
<source src="{{ url_for('download', filename=filename) }}" type="audio/wav">
</audio>
{% endif %}
</body>
</html>
其余代码保持不变。