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

avatar
作者
猴君
阅读量:0

介绍

在本教程中,我们将学习如何使用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/<filename>') 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函数来下载特定文件。

截图

获取示例项目

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

结论

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

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!