使用 Python Flask 实现 RESTful API 文件传输

在现代 web 开发中,文件上传和下载是非常常见的功能。本文将通过一个 Python Flask 的 RESTful API 示例,演示如何实现文件传输功能。假设我们要开发一个简单的应用程序,用户可以上传旅行相关的文件,例如图片,并且可以随时下载这些文件。

实际问题

我们设想一个需要存储旅行相关材料的场景。用户可能会上传护照复印件、机票确认信等文件。我们的目标是创建一个 API,允许用户进行文件上传和下载。

系统架构

我们的 API 结构将包括以下几个部分:

  1. 上传文件的端点
  2. 下载文件的端点
  3. 文件存储的管理
  4. 数据库设计(存储文件元数据)

数据库设计

我们将创建一个简单的数据库模型来存储文件的信息。使用 Mermaid 语法生成的ER图如下:

erDiagram
    FILE {
        int id PK
        string filename
        string file_path
        string uploaded_at
    }

    USER {
        int id PK
        string username
        string password
    }

    USER ||--o| FILE : uploads

上述模型中,用户可以上传多个文件,文件的信息将被存储在数据库中。

Flask API 实现

接下来我们将开始实现 Flask RESTful API。首先,确保安装 Flask 和 Flask-SQLAlchemy:

pip install Flask Flask-SQLAlchemy

然后,创建 app.py 文件,定义基本的 API:

from flask import Flask, request, jsonify, send_from_directory
from flask_sqlalchemy import SQLAlchemy
import os

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///files.db'
app.config['UPLOAD_FOLDER'] = 'uploads/'
db = SQLAlchemy(app)

class File(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    filename = db.Column(db.String(100), nullable=False)
    file_path = db.Column(db.String(200), nullable=False)

db.create_all()


@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return jsonify({'message': 'No file part'}), 400

    file = request.files['file']
    if file.filename == '':
        return jsonify({'message': 'No file selected'}), 400

    file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
    file.save(file_path)

    new_file = File(filename=file.filename, file_path=file_path)
    db.session.add(new_file)
    db.session.commit()

    return jsonify({'message': 'File uploaded successfully', 'file_id': new_file.id}), 201


@app.route('/files/<int:file_id>', methods=['GET'])
def download_file(file_id):
    file = File.query.get_or_404(file_id)
    return send_from_directory(app.config['UPLOAD_FOLDER'], file.filename)


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

在这个示例中,用户可以通过 /upload 端点上传文件,文件的元数据会被存储在 SQLite 数据库中。通过上传的文件 ID,用户可以通过 /files/<file_id> 端点下载相应的文件。

使用示例

  1. 上传文件

    我们可以使用 curl 命令上传文件:

    curl -F "file=@/path/to/your/file.jpg" http://localhost:5000/upload
    
  2. 下载文件

    下载文件使用文件 ID:

    curl -O http://localhost:5000/files/1
    

旅行图

以下是展示用户上传和下载文件的旅行图,使用 Mermaid 语法:

journey
    title 用户文件传输旅程
    section 上传文件
      用户选择文件: 5: 上传中文章上传文件
      上传文件到API: 5: 成功
    section 下载文件
      用户请求文件: 5: 下载成功

结论

通过这篇文章,我们展示了如何在 Python Flask 中创建 RESTful API,实现文件的上传和下载功能。我们使用了 Flask-SQLAlchemy 来管理数据库,确保了文件元数据的存储。同时,结合 Mermaid 语法,我们对数据库设计和用户旅程进行了可视化,帮助更好地理解系统的整体架构。希望这个示例能对你的开发工作有所帮助!