使用flask构建一个简单的文件同步系统

使用Python构建文件同步系统:步骤指南

在当今互联网时代,能够在本地机器和远程服务器之间同步文件的能力变得至关重要。无论是备份重要文档、与团队成员共享大文件,还是在多个设备间保持数据一致性,一个强大的文件同步系统都能发挥重要作用。在这篇博客文章中,我们将逐步介绍如何使用Python构建一个简单而强大的文件同步系统,并为大文件传输添加进度条功能。

挑战

我们的目标是创建一个系统,能够:

  1. 将本地文件上传到远程服务器
  2. 从服务器下载文件到本地机器
  3. 检查服务器上是否存在某个文件
  4. 处理大文件传输并提供可视化反馈

解决方案

我们将分两部分构建我们的解决方案:一个使用Flask的服务器端应用程序,和一个与服务器交互的客户端脚本。

第一部分:服务器

首先,让我们使用Flask创建一个简单的服务器,它可以处理文件上传、下载和存在性检查。

from flask import Flask, request, send_file, jsonify
import osapp = Flask(__name__)
UPLOAD_FOLDER = 'uploads'
if not os.path.exists(UPLOAD_FOLDER):os.makedirs(UPLOAD_FOLDER)@app.route('/upload', methods=['POST'])
def upload_file():if 'file' not in request.files:return jsonify({"error": "没有文件部分"}), 400file = request.files['file']if file.filename == '':return jsonify({"error": "没有选择文件"}), 400if file:filename = os.path.join(UPLOAD_FOLDER, file.filename)file.save(filename)return jsonify({"message": "文件上传成功"}), 200@app.route('/download/<filename>', methods=['GET'])
def download_file(filename):filepath = os.path.join(UPLOAD_FOLDER, filename)if os.path.exists(filepath):return send_file(filepath, as_attachment=True)else:return jsonify({"error": "文件未找到"}), 404@app.route('/check/<filename>', methods=['GET'])
def check_file(filename):filepath = os.path.join(UPLOAD_FOLDER, filename)if os.path.exists(filepath):return jsonify({"exists": True}), 200else:return jsonify({"exists": False}), 200if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

这个服务器提供了三个主要端点:

  • /upload 用于文件上传
  • /download/<filename> 用于文件下载
  • /check/<filename> 用于检查服务器上是否存在某个文件

第二部分:客户端

现在,让我们创建一个客户端脚本,它可以与我们的服务器交互并处理文件同步。我们将使用 requests 库进行HTTP通信,使用 tqdm 库来显示进度条。

import requests
import os
from tqdm import tqdmSERVER_URL = "http://your_server_ip:5000"def upload_file(filename):file_size = os.path.getsize(filename)with open(filename, 'rb') as f:with tqdm(total=file_size, unit='B', unit_scale=True, desc=f"正在上传 {filename}") as pbar:response = requests.post(f"{SERVER_URL}/upload",files={"file": f},data={"filename": os.path.basename(filename)},headers={"Content-Length": str(file_size)},stream=True)for chunk in response.iter_content(chunk_size=8192):if chunk:pbar.update(len(chunk))print(response.json())def download_file(filename):with requests.get(f"{SERVER_URL}/download/{filename}", stream=True) as response:if response.status_code == 200:total_size = int(response.headers.get('content-length', 0))with open(filename, 'wb') as f, tqdm(total=total_size, unit='B', unit_scale=True, desc=f"正在下载 {filename}") as pbar:for chunk in response.iter_content(chunk_size=8192):if chunk:size = f.write(chunk)pbar.update(size)print(f"文件 {filename} 下载成功")else:print(response.json())def check_file(filename):response = requests.get(f"{SERVER_URL}/check/{filename}")return response.json()['exists']def sync_file(filename):if os.path.exists(filename) and not check_file(filename):print(f"正在将 {filename} 上传到服务器...")upload_file(filename)elif check_file(filename) and not os.path.exists(filename):print(f"正在从服务器下载 {filename}...")download_file(filename)elif not check_file(filename) and not os.path.exists(filename):print(f"文件 {filename} 在本地和服务器上都不存在")else:print(f"文件 {filename} 在本地和服务器上都已存在")# 使用示例
sync_file("large_file.zip")

这个客户端脚本提供了几个关键功能:

  1. 文件上传:将文件发送到服务器,并显示进度条。
  2. 文件下载:从服务器检索文件,并显示进度条。
  3. 文件检查:验证服务器上是否存在某个文件。
  4. 同步逻辑:根据文件在本地和服务器上的存在情况,决定是上传、下载还是跳过该文件。

sync_file 函数封装了我们的同步逻辑:

  • 如果文件在本地存在但服务器上不存在,则上传。
  • 如果文件在服务器上存在但本地不存在,则下载。
  • 如果文件在两个位置都不存在,我们会得到通知。
  • 如果文件在两个位置都存在,我们会得到通知,无需采取任何操作。

整合使用

要使用这个文件同步系统:

  1. 在您的远程机器上启动Flask服务器。
  2. 在客户端脚本中更新 SERVER_URL,使其指向您的服务器。
  3. 运行客户端脚本,指定您想要同步的文件。

此外,如果你是本地服务器,进行了内网穿透,可以使用以下代码,优先使用本地ip地址,下面代码做了优化,将函数封装成为一个类

import requests
import os
from tqdm import tqdm
import timeclass FileSync:def __init__(self, server_url1, server_url2):self.SERVER_URL1 = server_url1self.SERVER_URL2 = server_url2self.server_url = Nonedef check_server(self, url):try:response = requests.get(url, timeout=5)return response.status_code == 200except requests.RequestException:return Falsedef get_server_url(self):if self.check_server(self.SERVER_URL1 + "check/test.txt"):self.server_url = self.SERVER_URL1return self.SERVER_URL1elif self.check_server(self.SERVER_URL2 + "check/test.txt"):self.server_url = self.SERVER_URL2return self.SERVER_URL2else:raise Exception("无法连接到任何服务器")def upload_file(self, filename):self.get_server_url()file_size = os.path.getsize(filename)with open(filename, 'rb') as f:with tqdm(total=file_size, unit='B', unit_scale=True, desc=f"正在上传 {filename}") as pbar:response = requests.post(f"{self.server_url}upload",files={"file": (os.path.basename(filename), f)},data={"filename": os.path.basename(filename)},stream=True)for chunk in iter(lambda: f.read(8192), b''):if chunk:pbar.update(len(chunk))print(response.json())def download_file(self, filename):self.get_server_url()with requests.get(f"{self.server_url}download/{os.path.basename(filename)}", stream=True) as response:if response.status_code == 200:total_size = int(response.headers.get('content-length', 0))block_size = 8192with open(filename, 'wb') as f, tqdm(total=total_size, unit='B', unit_scale=True, desc=f"正在下载 {filename}") as pbar:for chunk in response.iter_content(block_size):size = f.write(chunk)pbar.update(size)print(f"文件 {filename} 下载成功")else:print(response.json())def check_file(self, filename):self.get_server_url()basename = os.path.basename(filename)response = requests.get(f"{self.server_url}check/{basename}")return response.json()['exists']def sync_file(self, filename):try:self.get_server_url()  # 确保使用可用的服务器basename = os.path.basename(filename)if os.path.exists(filename) and not self.check_file(basename):print(f"正在将 {filename} 上传到服务器...")self.upload_file(filename)elif self.check_file(basename) and not os.path.exists(filename):print(f"正在从服务器下载 {filename}...")self.download_file(filename)elif not self.check_file(basename) and not os.path.exists(filename):print(f"文件 {filename} 在本地和服务器上都不存在")else:print(f"文件 {filename} 在本地和服务器上都已存在")except Exception as e:print(f"同步过程中发生错误: {str(e)}")# 使用示例
if __name__ == "__main__":sync = FileSync("http://你弟内网ip/:5000", "http://你的公网ip:5000")# print(sync.check_file("test.txt"))sync.sync_file(r"C:\BaiduSyncdisk\code&note\0A-ZATA\data\光谱数据\MZI酒精数据_21&27&79&30_.xlsx")

结论

这个简单而有效的文件同步系统展示了我们如何利用Python创建强大的工具来管理不同位置的数据。添加进度条使其特别适用于处理大文件,在可能较长的传输操作期间提供视觉反馈。

虽然这个系统是一个很好的起点,但还有许多方式可以扩展它:

  • 添加身份验证以实现安全的文件传输
  • 实现文件版本控制
  • 创建监视系统,自动同步更改
  • 开发图形用户界面,便于交互

祝您编码愉快,愿您的文件永远保持同步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455489.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity之如何在物体空间中制作马赛克

文章目录 前言屏幕空间马赛克着色器对象空间中的马赛克着色器最后前言 GrabPass 允许您创建应用马赛克叠加的着色器。如果你想在屏幕空间中应用马赛克,你可以通过使用片段着色器对其进行离散化来实现,但我在尝试将其应用到对象空间时遇到了问题,所以这是一个记录。 ▼ 原图…

proteus中没有STM32F103C8(已解决)

想在proteus找一个和开发板相同的芯片型号STM32F103C8T6&#xff0c;亲测proteus的7.8、8.6、8.9版本都没有STM32F103C8&#xff0c;然后在proteus8.15中找到了&#xff0c;M4内核的芯片也有。 M3内核&#xff1a; M4内核&#xff1a;

新脉集团携手中宏大数据 共推县域乡村振兴与数据资产化

2024年10月23日&#xff0c;数字生态赋能平台新脉集团与中宏大数据产业有限责任公司正式宣布达成战略合作。新脉集团创始人兼CEO李晶、新脉集团联合创始人兼CSO梁钟、新脉集团首席城市战略顾问邓详达、新脉中医健康教育学院院长王庆辉以及中宏大数据产业有限责任公司总裁张春宝…

053_python基于深度学习的短视频内容理解与推荐系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

ZYNQ PS_GPIO中断

REVIEW zynq PS端 GPIO_zynq modem signal-CSDN博客 C基础与SDK调试方法_csdk-CSDN博客 AXI_GPIO_axigpio-CSDN博客 对于GPIO&#xff0c;前面只用了简单读写&#xff0c;今天搞一下中断 1. 今日摸鱼任务 了解中断原理&#xff0c;实现PS_GPIO中断。 MIIO: #define PS_KEY 47#…

零售行业的数字化营销转型之路

一方面&#xff0c;市场竞争激烈&#xff0c;电商平台、新兴品牌和跨界对手带来巨大压力。另一方面&#xff0c;消费者需求变化迅速&#xff0c;更加追求个性化、多元化和便捷化的购物体验&#xff0c;同时传统零售企业还面临着高成本压力&#xff0c;如租金、人力和库存等。 然…

Chainlit集成LlamaIndex和Chromadb实现RAG增强生成对话AI应用

前言 本文主要讲解如何使用LlamaIndex和Chromadb向量数据库实现RAG应用&#xff0c;并使用Chainlit快速搭建一个前端对话网页&#xff0c;实现RAG聊天问答增强的应用。文章中还讲解了LlamaIndex 的CallbackManager回调&#xff0c;实现案例是使用TokenCountingHandler&#xf…

Pollard‘s p-1算法

概述 光滑数 (Smooth number)&#xff1a;指可以分解为多个小素数乘积的正整数 当p是N 的因数&#xff0c;并且p−1是光滑数&#xff0c;可以考虑使用Pollards p-1算法来分解N 当p是N的因数&#xff0c;并且p1是光滑数&#xff0c;可以考虑使用Williamss p1算法来分解N 这里…

程序员节-回顾篇

回顾&#xff1a; 时间如白驹过隙&#xff0c;转眼间&#xff0c;我们又走过了一个充满挑战与机遇的年份。回顾过去的一年&#xff0c;心中充满了感慨与收获。 一、个人成长 这一年里&#xff0c;我在各个方面都有了显著的成长。在工作上&#xff0c;我通过不断学习和实践&a…

【小洛的VLOG】Web 服务器高并发压力测试(Reactor模型测试)

目录 引言 工具介绍 环境介绍 测试结果 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 大部分的网络通信都是支持TCP/IP协议栈&#xff0c;为了保证通信的可靠性&#xff0c;客户端和服务端之间需要建立链接。服务端能并发处理多少个链接&#xff0c;平均每秒钟能处理…

国产蓝牙耳机哪个品牌值得买?百元国产蓝牙耳机品牌排行榜

一款优质的蓝牙耳机总能为我们带来更加便捷、舒适的听觉体验&#xff0c;而在众多蓝牙耳机品牌中&#xff0c;国产蓝牙耳机凭借其高性价比、丰富的功能和独特的设计&#xff0c;逐渐赢得了消费者的青睐&#xff0c;那么国产蓝牙耳机哪个品牌值得买&#xff1f;作为一个资深的蓝…

一、Linux 目录文件

一、目录结构 |-/ # 根节&#xff08;cd /&#xff09; |-/bin # 系统命令 |-/boot # 启动目录 |-/dev # 设备文件保存目录 |-/etc # 系统的所有配置文件|-profile # 环境变量配置文件&#xff08;修改后需source /etc/profile使配置文件立即生效&#xff09; |-/home # 普通用…

光储充微电网:策略调度带领能源新未来---安科瑞 吴雅芳

一、光储充微电网概述 光储充微电网是一种高度智能化的电力系统&#xff0c;在新能源领域占据着重要地位。它主要由光伏电站、储能系统、充电桩、微电网控制器等组成。 光伏电站是光储充微电网的核心部分之一&#xff0c;应选择稳定的组件和好的支架。在设计光伏发电系统时&a…

解锁文本数据可视化的无限可能:Wordcloud库全解析

文章目录 **&#x1f31f;解锁文本数据可视化的无限可能&#xff1a;Wordcloud库全解析&#x1f510;**1. **背景介绍**2. **Wordcloud库是什么&#xff1f;**3. **如何安装Wordcloud库&#xff1f;**4. **Wordcloud库的基本函数使用方法**5. **实际应用场景**6. **常见问题及解…

实操 maxkey对接三方文档

实操 maxkey 对接三方文档 概述前置准备&#xff1a;MaxKey 安装与配置&#xff1a;第三方系统准备网络环境 对接三方配置oauth2协议对接导入jar包&#xff08;调接口&#xff09;权限加回调重定向获取token处理业务 api对接三方获取api凭证配置 MaxKey更新代码 概述 最近在搞m…

hhdb数据库介绍

背景 随着互联网的崛起&#xff0c;海量数据的存储、计算、分析需求越来越普遍。在各种计算机应用场景中&#xff0c;传统集中式数据库面临着理论升级和技术升级两大难题。21世纪以来&#xff0c;随着以 Hadoop及其衍生技术为代表的大规模数据处理技术的崛起&#xff0c;数据库…

迁移学习|ResNet18

一、导入库 二、设置随机种子 三、数据增强和数据加载 四、加载预训练模型 五、定义损失函数和优化器 六、学习率调度器 七、训练模型 八、可视化训练过程 九、总结 1. 常见优化器概述 1.1 随机梯度下降&#xff08;SGD: Stochastic Gradient Descent&#xff09; 简介&…

SIP 业务举例之 三方通话:邀请第三方加入的信令流程

目录 1. 3-Way Conference - Third Party Is Added 简介 2. RFC5359 的 3-Way Conference - Third Party Is Added 信令流程 3. 3-Way Conference - Third Party Is Added 总结 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信)…

青少年编程能力等级测评CPA C++(三级)-试卷2

青少年编程能力等级测评CPA C&#xff08;三级&#xff09;-试卷2 一、单项选择题&#xff08;共15题&#xff0c;每题3分&#xff0c;共45分&#xff09; CP3_2_1&#xff0e;在宽度为500米的河道上&#xff0c;修建一个拦河大坝。施工队每天筑坝50米&#xff0c;由于当时条件…

Qt 实战(11)样式表 | 11.2、使用样式表

文章目录 一、使用样式表1、盒子模型2、应用样式表2.1、全局应用2.2、局部应用2.3、通过文件应用 3、使用样式表实现换肤 前言&#xff1a; 在Qt框架中&#xff0c;样式表&#xff08;Style Sheets&#xff09;是一种功能强大的工具&#xff0c;它允许开发者以一种简洁而高效的…