记录在 Flask 项目中实现文件上传接口的基本方法与注意事项。
一、后端接口实现
import os
from flask import Flask, request, jsonify
app = Flask(__name__)
UPLOAD_FOLDER = './uploads'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'error': '没有文件部分'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': '没有选择文件'}), 400
# 保存文件
save_path = os.path.join(UPLOAD_FOLDER, file.filename)
file.save(save_path)
return jsonify({'message': '文件上传成功', 'filename': file.filename})
二、前端请求示例
使用 HTML Form
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">上传</button>
</form>
使用 fetch API
const formData = new FormData()
formData.append('file', fileInput.files[0])
fetch('/upload', {
method: 'POST',
body: formData
}).then(res => res.json())
.then(console.log)
三、文件类型与大小限制
from werkzeug.utils import secure_filename
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/upload', methods=['POST'])
def upload_file_with_check():
file = request.files.get('file')
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(UPLOAD_FOLDER, filename))
return jsonify({'message': '上传成功'})
return jsonify({'error': '文件类型不允许'}), 400
可以通过配置 app.config['MAX_CONTENT_LENGTH']
限制文件大小。
四、注意事项
- 使用
secure_filename
避免路径穿越问题 - 对上传文件做类型与大小限制
- 上传目录应配置访问权限,避免直接执行上传文件
- 大文件上传可考虑分片上传与断点续传