介绍
在本教程中,我们将学习如何使用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数据库来管理上传的文件。希望本教程对您有所帮助!