记录在 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 避免路径穿越问题
  • 对上传文件做类型与大小限制
  • 上传目录应配置访问权限,避免直接执行上传文件
  • 大文件上传可考虑分片上传与断点续传