构建个人文件上传服务:Python Flask实现上传和下载完整指南
创始人
2024-11-06 04:08:47

介绍

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

截图

获取示例项目

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

结论

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

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...