💡 学习flask是因为大创,需求是接收微信小程序发送来的音频,而后由学长的算法对该音频进行分析。

后端接收文件上传

原生flask使用的是request包

1
2
3
4
5
6
7
8
from werkzeug.utils import secure_filename
from flask import request

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
file = request.files['the_file']
file.save(f"/var/www/uploads/{secure_filename(file.filename)}")

但尝试这样接收小程序上传的文件时,报错

'Request' object has no attribute 'File'

经过搜索得知,微信小程序的文件被包裹在FileField中,无法靠Request.file检索

要处理FileField式的文件上传,需要使用另外两个包

教程见 How to Handle File Uploads with Flask

我最终的代码如下, flask确实轻量,只用了30行不到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from flask import Flask
from flask_wtf import FlaskForm
from flask_wtf.file import FileField
from flask_uploads import configure_uploads,UploadSet,AUDIO

app = Flask(__name__)
# 进入调试模式
app.debug = True
#必须以UPLOADED_XXX_DEST的形式设置文件存放的地址,XXX取决于UploadSet的变量名大写形式
app.config['UPLOADED_SOUNDS_DEST'] = './uploads'
#必须设置密匙,否则会报跨域错误
app.config['SECRET_KEY'] = 'heyheyhey'
# UploadSet的第二个参数取决于上传文件的形式,有哪些形式请自行翻看源码
sounds = UploadSet('sounds',AUDIO)
configure_uploads(app,sounds)

class MyForm(FlaskForm):
sound = FileField('sound')

@app.route("/upload2",methods=['POST'])
def upload():
form = MyForm()
filename = sounds.save(form.sound.data)
return filename

if __name__ == '__main__':
app.run(debug=True)