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

2024-07-21 1214阅读

介绍

在本教程中,我们将学习如何使用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购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]