构建个人文件上传服务:Python Flask实现上传和下载完整指南
介绍
在本教程中,我们将学习如何使用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数据库来管理上传的文件。希望本教程对您有所帮助!
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。