构建个人文件上传服务:Python Flask实现上传和下载完整指南

07-21 586阅读

介绍

在本教程中,我们将学习如何使用Python Flask框架将文件上传到服务器,并使用SQLite数据库来跟踪上传的文件。我们将提供后端代码和一个示例项目的Git链接,以便您可以轻松地跟随本教程。

准备工作

首先,您需要安装Python和Flask框架。您可以按照Flask官方文档上的说明进行安装

pip install flask

项目结构

我们的项目包含以下文件:

  • app.py:包含Flask应用程序的后端代码
  • file_mapping.db:SQLite数据库文件,用于跟踪上传的文件
  • uploads文件夹:用于存储上传的文件

    代码解释

    import os
    import uuid
    import sqlite3
    from flask import Flask, request, send_from_directory, render_template
    app = Flask(__name__)
    UPLOAD_FOLDER = 'uploads'
    app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
    app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024  # 设置最大文件上传大小为 100MB
    # 创建保存文件的目录
    if not os.path.exists(UPLOAD_FOLDER):
        os.makedirs(UPLOAD_FOLDER)
    # 初始化数据库
    conn = sqlite3.connect('file_mapping.db')
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS files
                 (id INTEGER PRIMARY KEY, original_filename TEXT, new_filename TEXT)''')
    conn.commit()
    conn.close()
    @app.route('/')
    def index():
        return render_template("Upload.html")
    @app.route('/upload', methods=['POST'])
    def upload_file():
        if request.method == 'POST':
            if 'folder' not in request.files:
                return 'No folder part'
            folder = request.files.getlist('folder')
            try:
                conn = sqlite3.connect('file_mapping.db')
                # noinspection PyShadowingNames
                c = conn.cursor()
                for file in folder:
                    if file.filename == '':
                        return '没有选择文件'
                    if file:
                        original_filename = file.filename
                        # 查询数据库,检查文件名是否已经存在
                        c.execute("SELECT id FROM files WHERE original_filename=?", (original_filename,))
                        existing_file = c.fetchone()
                        if existing_file:
                            continue
                        else:
                            # 生成唯一的文件名
                            new_filename = str(uuid.uuid4()) + os.path.splitext(original_filename)[1]
                            file_path = os.path.join(app.config['UPLOAD_FOLDER'], new_filename)
                            file.save(file_path)
                            # 存储原始文件名和新文件名的关联关系到数据库
                            c.execute("INSERT INTO files (original_filename, new_filename) VALUES (?, ?)",
                                      (original_filename, new_filename))
                conn.commit()
                return '文件上传完成'
            except Exception as e:
                return '文件上载过程中出错: {}'.format(str(e))
            finally:
                conn.close()
        else:
            return '请求方法不允许'
    @app.route('/list_files', methods=['GET'])
    def list_files():
        conn = sqlite3.connect('file_mapping.db')
        c = conn.cursor()
        c.execute("SELECT original_filename, new_filename FROM files")
        files = c.fetchall()
        conn.close()
        return render_template('Review.html', files=files)
    @app.route('/download/')
    def download_file(filename):
        return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5001, debug=True)
    

    上传文件

    我们使用upload_file函数来处理文件上传。在这个函数中,我们首先检查请求中是否存在文件,然后逐个处理上传的文件。对于每个文件,我们检查数据库中是否已经存在相同的文件名,如果不存在,则生成一个新的唯一文件名,并将文件保存到服务器的uploads文件夹中。

    查看和下载文件

    我们可以使用list_files函数来查看已上传的文件列表,并使用download_file函数来下载特定文件。

    截图

    构建个人文件上传服务:Python Flask实现上传和下载完整指南

    构建个人文件上传服务:Python Flask实现上传和下载完整指南

    获取示例项目

    您可以从以下Git链接中获取完整的示例项目:file-upload.git

    结论

    通过本教程,您将学会如何使用Python Flask框架将文件上传到服务器,并使用SQLite数据库来管理上传的文件。希望本教程对您有所帮助!

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]