news 2026/9/16 20:40:16

Python+frp搭建轻量级文件共享系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python+frp搭建轻量级文件共享系统

1. 项目背景与核心需求

最近在帮朋友搭建一个轻量级的文件共享系统,需求很简单:通过网页上传文件到服务器,并能随时下载。这个场景其实在很多中小团队内部协作中都很常见——比如设计稿共享、文档版本管理或者临时文件交换。传统方案要么太重(比如Nextcloud),要么太简陋(直接FTP),于是决定自己用Python配合frp写个轻量级解决方案。

frp是个高性能的反向代理工具,特别适合没有公网IP的内网穿透场景。而Python的Flask框架可以快速搭建Web界面,两者结合正好满足需求。整个系统需要实现以下核心功能:

  • 网页端文件上传(支持多文件、大文件)
  • 文件列表展示与下载
  • 简单的权限控制(至少要有上传密码)
  • 通过frp实现外网访问

2. 技术方案设计

2.1 整体架构设计

系统采用经典的三层架构:

[浏览器] ←HTTP→ [frp服务端] ←隧道→ [frp客户端] ←HTTP→ [Flask应用] ←→ [文件存储]

关键组件选型理由:

  1. Flask框架:相比Django更轻量,适合小型文件服务
  2. frp v0.38.0:稳定版本,支持TCP/HTTP两种穿透模式
  3. Bootstrap 5:快速构建美观的前端界面
  4. werkzeug.security:内置密码哈希工具

2.2 关键技术点

2.2.1 文件上传处理

使用Flask的request.files处理上传,特别注意:

@app.route('/upload', methods=['POST']) def upload(): if request.form.get('password') != config.UPLOAD_PWD: return "Invalid password", 403 for file in request.files.getlist('file'): if file.filename == '': continue filename = secure_filename(file.filename) file.save(os.path.join(UPLOAD_FOLDER, filename))
2.2.2 frp穿透配置

服务端frps.ini关键配置:

[common] bind_port = 7000 vhost_http_port = 8080

客户端frpc.ini配置示例:

[common] server_addr = your_server_ip server_port = 7000 [web] type = http local_port = 5000 custom_domains = your.domain.com

3. 完整实现步骤

3.1 环境准备

  1. 服务端(有公网IP的VPS):

    wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz tar -zxvf frp_0.38.0_linux_amd64.tar.gz
  2. 客户端(本地运行Python的环境):

    pip install flask python-dotenv

3.2 Flask应用开发

3.2.1 基础结构
# app.py from flask import Flask, render_template, request, send_from_directory import os from werkzeug.utils import secure_filename 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)
3.2.2 路由实现
@app.route('/') def index(): files = os.listdir(app.config['UPLOAD_FOLDER']) return render_template('index.html', files=files) @app.route('/download/<filename>') def download(filename): return send_from_directory( app.config['UPLOAD_FOLDER'], filename, as_attachment=True )

3.3 前端页面

<!-- templates/index.html --> <form method="post" enctype="multipart/form-data" action="/upload"> <input type="password" name="password" placeholder="Upload Password"> <input type="file" name="file" multiple> <button type="submit">Upload</button> </form> <ul> {% for file in files %} <li><a href="/download/{{ file }}">{{ file }}</a></li> {% endfor %} </ul>

4. 部署与优化

4.1 frp服务端启动

./frps -c frps.ini

4.2 本地运行

export FLASK_APP=app.py flask run --host=0.0.0.0 --port=5000

4.3 性能优化技巧

  1. 大文件上传:添加进度条显示

    // 前端添加XMLHttpRequest进度事件监听 xhr.upload.onprogress = function(e) { if (e.lengthComputable) { var percent = Math.round((e.loaded / e.total) * 100); progressBar.style.width = percent + '%'; } };
  2. 安全增强

    • 添加文件类型白名单
    • 定期清理过期文件
    • 使用HTTPS(通过frp的https2http功能)

5. 常见问题解决

5.1 上传失败排查

  1. 检查frp连接状态:
    netstat -tulnp | grep frpc
  2. 查看Flask日志:
    tail -f /tmp/flask.log

5.2 性能问题

  • 大文件上传超时:调整frp的tcp_mux = false
  • 内存不足:限制单文件大小,添加流式处理

5.3 权限控制

建议的进阶方案:

# 在config.py中 DOWNLOAD_TOKENS = { "user1": "token1", "user2": "token2" } # 路由中添加验证 @app.route('/download/<filename>') def download(filename): token = request.args.get('token') if token not in config.DOWNLOAD_TOKENS.values(): abort(403) ...

6. 扩展建议

  1. 数据库记录:使用SQLite记录文件元信息
  2. 分享链接:生成时效性下载链接
  3. API支持:添加RESTful接口供程序调用
  4. 日志审计:记录所有上传下载操作

这个方案在实际测试中,单台1核1G的VPS可以稳定支持20人团队的文件共享需求。对于更复杂的场景,可以考虑加入用户系统、文件预览等功能扩展。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 20:38:02

MQ消息积压排查四层心法:从卡顿表象到代码根因

1. 这不是“队列满了”的简单告警&#xff0c;而是系统脉搏的异常跳动MQ消息积压&#xff0c;从来不是一句“队列长度超限”就能轻描淡写带过的现象。它像血管里突然出现的血栓&#xff0c;表面看是某条通道堵了&#xff0c;背后却可能牵扯到心脏&#xff08;生产端&#xff09…

作者头像 李华
网站建设 2026/9/16 20:37:53

Java+多线程实现S3分段上传:大文件并发性能优化实战

做后端这些年&#xff0c;往对象存储传大文件这件事几乎避不开。前阵子接了个需求&#xff1a;一批单个大小在1GB到5GB不等的文件要传到AWS S3&#xff0c;业务方给的时间窗口很紧。最开始我用最直观的putObject单连接上传&#xff0c;结果大文件传到一半经常连接超时&#xff…

作者头像 李华
网站建设 2026/9/16 20:37:07

WRF定制Vtable接入ERA5-Land土壤湿度全流程详解

WRF跑通一个案例不难&#xff0c;真正烦的是换数据源之后&#xff0c;WPS的ungrib组件开始闹脾气。ungrib能不能把一份GRIB文件里你想要的变量解出来&#xff0c;全看Vtable这张“变量翻译表”对不对得上。我从第一次配Vtable踩坑到现在&#xff0c;至少手改过五六份Vtable&…

作者头像 李华
网站建设 2026/9/16 20:36:56

SEO入门指南:从零开始掌握搜索引擎优化

1. 从零开始理解SEO的核心价值我第一次接触SEO是在2012年运营个人博客时&#xff0c;当时发现同样的内容&#xff0c;有的文章阅读量能过万&#xff0c;有的却只有几十次点击。这个现象让我开始深入研究搜索引擎优化&#xff08;SEO&#xff09;的奥秘。SEO本质上是通过对网站内…

作者头像 李华