首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
Flask简介与安装
第一个Flask应用
Flask路由与视图函数
Flask模板引擎Jinja2
Flask模板继承与包含
Flask静态文件处理
Flask表单处理
Flask请求与响应
Flask配置与日志
Flask蓝图与模块化设计
Flask扩展插件介绍
Flask数据库操作(一):SQLAlchemy基础
Flask数据库操作(二):迁移与模型关系
Flask数据库操作(三):数据库迁移与版本控制
Flask会话管理
Flask中间件与钩子函数
Flask错误处理与测试
Flask性能优化(一):缓存策略
Flask性能优化(二):异步与后台任务
Flask部署与运维
Flask源码解析(一):Werkzeug与Jinja2
Flask源码解析(二):路由系统
Flask源码解析(三):视图与请求处理
Flask源码解析(四):扩展插件机制
Flask安全性与防护策略
Flask国际化与本地化
Flask RESTful API开发(一):基础概念
Flask RESTful API开发(二):认证与权限控制
Flask RESTful API开发(三):版本控制与文档
Flask与前端框架集成(一):React
Flask与前端框架集成(二):Vue.js
Flask与前端框架集成(三):Angular
Flask微服务架构与实践(一):服务拆分与通信
Flask微服务架构与实践(二):容器化与编排
Flask微服务架构与实践(三):监控与故障排查
Flask性能监控与调优
Flask与其他Web框架对比分析
Flask插件开发与实践
Flask项目实战经验分享
Flask生态圈及发展趋势
实战项目一:搭建个人博客系统
实战项目二:开发在线投票系统
实战项目三:构建企业级后台管理系统
实战项目四:实现文件上传与下载功能
实战项目五:开发实时聊天室
实战项目六:构建RESTful API接口
实战项目七:实现用户权限管理系统
实战项目八:开发微信小程序后台
实战项目九:构建电商平台(一):商品管理
实战项目九:构建电商平台(二):购物车与订单
实战项目九:构建电商平台(三):支付与物流
实战项目十:搭建分布式爬虫系统
实战项目十一:实现数据可视化与分析
实战项目十二:开发在线教育平台(一):课程管理
实战项目十二:开发在线教育平台(二):视频点播
实战项目十二:开发在线教育平台(三):直播互动
实战项目十三:构建社交网络(一):用户关系
实战项目十三:构建社交网络(二):信息流与推荐
实战项目十三:构建社交网络(三):朋友圈与评论
实战项目总结与拓展
当前位置:
首页>>
技术小册>>
Flask框架入门指南
小册名称:Flask框架入门指南
### 实战项目四:实现文件上传与下载功能 在Web开发中,文件上传与下载功能是常见的需求,它们为用户提供了与服务器交互数据的直观方式。本章节将基于Flask框架,详细讲解如何构建一个具备文件上传与下载功能的小型Web应用。我们将通过创建路由、处理表单、保存文件以及提供下载链接等步骤,逐步构建一个实用的功能模块。 #### 1. 项目概述 在本项目中,我们将构建一个简单的Web服务,用户可以通过浏览器上传文件至服务器,并能在之后的某个时间点下载这些文件。为简化示例,我们将专注于文本文件和图片文件的处理,但相同的方法可以轻松地扩展到其他类型的文件。 #### 2. 环境准备 在开始编写代码之前,请确保你已经安装了Python和Flask。你可以通过pip安装Flask(如果尚未安装): ```bash pip install Flask ``` 为了处理文件上传,Flask 自带了 `werkzeug.utils.secure_filename` 用于安全地处理文件名,避免安全漏洞如路径遍历攻击。此外,我们将使用HTML表单来上传文件,因此无需额外安装库。 #### 3. 创建Flask应用 首先,我们创建一个基本的Flask应用框架。 ```python from flask import Flask, render_template, request, redirect, url_for, send_from_directory import os app = Flask(__name__) # 设置文件上传目录 UPLOAD_FOLDER = 'uploads/' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # 确保上传文件夹存在 if not os.path.exists(UPLOAD_FOLDER): os.makedirs(UPLOAD_FOLDER) # 允许的文件类型 ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/') def index(): # 可以在这里列出所有上传的文件供用户下载 files = [f for f in os.listdir(UPLOAD_FOLDER) if os.path.isfile(os.path.join(UPLOAD_FOLDER, f))] return render_template('index.html', files=files) # 其他路由和函数将在这里定义 if __name__ == '__main__': app.run(debug=True) ``` #### 4. 实现文件上传 接下来,我们实现一个路由来处理文件上传。 ```python @app.route('/upload', methods=['GET', 'POST']) def upload_file(): if request.method == 'POST': # 检查是否有文件在请求中 if 'file' not in request.files: return redirect(request.url) file = request.files['file'] # 如果用户没有选择文件,浏览器也会提交一个没有文件名的空部分 if file.filename == '': return redirect(request.url) if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) return redirect(url_for('index')) return render_template('upload.html') ``` 注意,这里使用了secure `_filename` 函数来避免安全问题,并且检查了文件类型是否在允许的列表中。 #### 5. 创建HTML模板 为了上传文件,我们需要一个HTML表单。创建 `templates/upload.html`: ```html <!doctype html> <html> <head> <title>Upload File</title> </head> <body> <h1>Upload new File</h1> <form method=post enctype=multipart/form-data> <input type=file name=file> <input type=submit value=Upload> </form> </body> </html> ``` 同时,为了显示上传的文件并提供下载链接,修改 `templates/index.html`: ```html <!doctype html> <html> <head> <title>File Manager</title> </head> <body> <h1>Uploaded Files</h1> <ul> {% for file in files %} <li><a href="{{ url_for('download_file', filename=file) }}">{{ file }}</a></li> {% endfor %} </ul> <a href="{{ url_for('upload_file') }}">Upload New File</a> </body> </html> ``` #### 6. 实现文件下载 现在,我们需要一个路由来处理文件下载请求。 ```python @app.route('/download/<filename>') def download_file(filename): return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True) ``` 这个路由使用 `send_from_directory` 函数来发送文件作为响应,`as_attachment=True` 参数确保浏览器以附件形式处理文件,从而触发下载。 #### 7. 测试应用 启动Flask应用后,访问 `http://127.0.0.1:5000/` 应该能看到文件列表(初始为空),并提供一个上传新文件的链接。点击链接,上传一个支持的文件类型,然后刷新首页,你应该能看到新上传的文件及其下载链接。 #### 8. 安全性与扩展 - **安全性**:虽然我们已经使用 `secure_filename` 和检查文件类型来增强安全性,但还需考虑其他潜在的安全风险,如文件大小限制、上传频率控制等。 - **扩展性**:可以添加更多功能,如文件预览、删除已上传文件、文件版本控制等。 - **用户认证**:在实际应用中,你可能需要实现用户认证和授权,以确保只有授权用户才能上传或下载文件。 #### 9. 结论 通过本章节的学习,你应该能够使用Flask框架实现基本的文件上传与下载功能。这不仅是Web开发中的一项基本技能,也是构建更复杂应用的基础。希望你在实践中能够进一步探索和优化这些功能,以满足不同的需求场景。
上一篇:
实战项目三:构建企业级后台管理系统
下一篇:
实战项目五:开发实时聊天室
该分类下的相关小册推荐:
Flask框架零基础入门与实战开发