您好,登录后才能下订单哦!
在现代Web开发中,文件上传是一个常见的需求。Flask轻量级的Python Web框架,提供了简单易用的工具来处理文件上传。本文将详细介绍如何在Flask应用中实现文件上传,并使用Python的dbm
模块来管理上传的文件信息。
首先,确保你已经安装了Flask。如果还没有安装,可以使用以下命令进行安装:
pip install Flask
创建一个简单的Flask应用,用于处理文件上传:
from flask import Flask, render_template, request, redirect, url_for
import os
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads/'
if not os.path.exists(app.config['UPLOAD_FOLDER']):
os.makedirs(app.config['UPLOAD_FOLDER'])
@app.route('/')
def index():
return render_template('index.html')
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return redirect(request.url)
file = request.files['file']
if file.filename == '':
return redirect(request.url)
if file:
filename = file.filename
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
在templates
目录下创建一个index.html
文件,用于上传文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>File Upload</title>
</head>
<body>
<h1>Upload a File</h1>
<form action="{{ url_for('upload_file') }}" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
</body>
</html>
运行Flask应用:
python app.py
访问http://127.0.0.1:5000/
,你将看到一个简单的文件上传表单。选择一个文件并点击“Upload”按钮,文件将被上传到uploads/
目录。
dbm
是Python标准库中的一个模块,用于简单的键值对存储。我们可以使用dbm
来存储上传文件的相关信息,如文件名、上传时间等。
dbm
是Python标准库的一部分,无需额外安装。
修改app.py
,添加dbm
操作:
import dbm
from datetime import datetime
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return redirect(request.url)
file = request.files['file']
if file.filename == '':
return redirect(request.url)
if file:
filename = file.filename
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
# 使用dbm存储文件信息
with dbm.open('file_info.db', 'c') as db:
db[filename] = str(datetime.now())
return redirect(url_for('index'))
@app.route('/files')
def list_files():
files = []
with dbm.open('file_info.db', 'r') as db:
for key in db.keys():
files.append({
'filename': key.decode('utf-8'),
'upload_time': db[key].decode('utf-8')
})
return render_template('files.html', files=files)
在templates
目录下创建一个files.html
文件,用于显示上传的文件列表:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Uploaded Files</title>
</head>
<body>
<h1>Uploaded Files</h1>
<table border="1">
<tr>
<th>Filename</th>
<th>Upload Time</th>
</tr>
{% for file in files %}
<tr>
<td>{{ file.filename }}</td>
<td>{{ file.upload_time }}</td>
</tr>
{% endfor %}
</table>
<a href="{{ url_for('index') }}">Back to Upload</a>
</body>
</html>
再次运行Flask应用,上传文件后,访问http://127.0.0.1:5000/files
,你将看到上传的文件列表及其上传时间。
我们可以添加一个功能,允许用户删除已上传的文件。
修改app.py
,添加删除功能:
@app.route('/delete/<filename>')
def delete_file(filename):
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
if os.path.exists(filepath):
os.remove(filepath)
with dbm.open('file_info.db', 'w') as db:
if filename.encode('utf-8') in db:
del db[filename.encode('utf-8')]
return redirect(url_for('list_files'))
修改files.html
,添加删除链接:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Uploaded Files</title>
</head>
<body>
<h1>Uploaded Files</h1>
<table border="1">
<tr>
<th>Filename</th>
<th>Upload Time</th>
<th>Action</th>
</tr>
{% for file in files %}
<tr>
<td>{{ file.filename }}</td>
<td>{{ file.upload_time }}</td>
<td><a href="{{ url_for('delete_file', filename=file.filename) }}">Delete</a></td>
</tr>
{% endfor %}
</table>
<a href="{{ url_for('index') }}">Back to Upload</a>
</body>
</html>
我们可以添加一个功能,允许用户下载已上传的文件。
修改app.py
,添加下载功能:
from flask import send_from_directory
@app.route('/download/<filename>')
def download_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
修改files.html
,添加下载链接:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Uploaded Files</title>
</head>
<body>
<h1>Uploaded Files</h1>
<table border="1">
<tr>
<th>Filename</th>
<th>Upload Time</th>
<th>Action</th>
</tr>
{% for file in files %}
<tr>
<td>{{ file.filename }}</td>
<td>{{ file.upload_time }}</td>
<td>
<a href="{{ url_for('download_file', filename=file.filename) }}">Download</a>
<a href="{{ url_for('delete_file', filename=file.filename) }}">Delete</a>
</td>
</tr>
{% endfor %}
</table>
<a href="{{ url_for('index') }}">Back to Upload</a>
</body>
</html>
本文详细介绍了如何在Flask应用中实现文件上传,并使用dbm
模块来管理上传的文件信息。通过扩展功能,我们还实现了文件的删除和下载。dbm
简单的键值对存储工具,非常适合用于管理小规模的文件信息。对于更复杂的应用场景,可以考虑使用更强大的数据库系统,如SQLite、MySQL或PostgreSQL。
通过本文的学习,你应该能够掌握Flask文件上传的基本操作,并了解如何使用dbm
来管理文件信息。希望本文对你有所帮助,祝你在Flask开发中取得更多成果!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。