使用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.mzph.cn/pingmian/57571.shtml

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

相关文章

【有啥问啥】智能座舱中的儿童遗留检测(CPD,Child Presence Detection)技术详解

智能座舱中的儿童遗留检测&#xff08;CPD&#xff0c;Child Presence Detection&#xff09;技术详解 引言 儿童遗留检测&#xff08;CPD&#xff0c;Child Presence Detection&#xff09;系统是一项旨在保护儿童免受因被遗忘在车内而导致的热中暑危险的重要安全技术。近年…

HCIP-HarmonyOS Application Developer 习题(十五)

&#xff08;判断&#xff09;1、在HarmonyOs中发布带权限公共事件&#xff0c;发布者首先要在config.json中申请所需的权限。 答案&#xff1a;正确 分析&#xff1a;发布携带权限的公共事件&#xff1a;构造CommonEventPublishInfo对象&#xff0c;设置订阅者的权限。 &#…

书生营 L0G4000 玩转HF/魔搭/魔乐社区

模型下载 在codespace上给环境装包&#xff0c;按照教材即可 运行后下载成功 建立下载json文件 新建下载internlm2_5-chat-1_8b的json文件 运行结果 基本上没啥问题&#xff0c;照着教程来就行 模型上传&#xff08;可选&#xff09; push的时候需要先认证token 最后的…

Linux 权限的理解

内容摘要 本文内容包括shell的运行原理&#xff0c;包括外壳程序的原理、理解、和意义&#xff0c;以及从两个方面对于权限的理解&#xff08;人和事物的属性&#xff09;、修改文件的权限&#xff0c;包括修改文件的拥有者、修改文件拥有者所在的组的用户以及修改文件的三类用…

域渗透AD渗透攻击利用 MS14-068漏洞利用过程 以及域渗透中票据是什么 如何利用

目录 wmi协议远程执行 ptt票据传递使用 命令传递方式 明文口令传递 hash口令传递 票据分类 kerberos认证的简述流程 PTT攻击的过程 MS14-068 漏洞 执行过程 wmi协议远程执行 wmi服务是比smb服务高级一些的&#xff0c;在日志中是找不到痕迹的&#xff0c;但是这个主…

鸿蒙中富文本编辑与展示

富文本在鸿蒙系统如何展示和编辑的&#xff1f;在文章开头我们提出这个疑问&#xff0c;带着疑问来阅读这篇文章。 富文本用途可以展示图文混排的内容&#xff0c;在日常App 中非常常见&#xff0c;比如微博的发布与展示&#xff0c;朋友圈的发布与展示&#xff0c;都在使用富文…

【树莓派 5B】anaconda换源 更换清华源

【树莓派 5B】anaconda换源 更换清华源 前言 本文基于树莓派5B上运行的 Raspberrypi-OS-64bit &#xff08;Debian 12 Bookworm&#xff09;平台&#xff0c;更换 Anaconda 官方源为清华大学镜像源&#xff0c;旨在解决网络连接超时、连接官方源失败、下载速度慢的问题。 参…

spring (Aop) day 1024

ok了家人们&#xff0c;继续学习spring &#xff0c;这段知识点有点绕&#xff0c;建议搭配b站的视频去学&#xff0c;passion&#xff01;&#xff01;&#xff01; 八.AOP-面向切面编程 8.1 动态代理 8.1.1 概述 什么是代理&#xff1f;在现实生活中&#xff0c;代理很常见…

学习虚幻C++开发日志——TSet

TSet 官方文档&#xff1a;虚幻引擎中的Set容器 | 虚幻引擎 5.5 文档 | Epic Developer Community (epicgames.com) TSet 是通过对元素求值的可覆盖函数&#xff0c;使用数据值本身作为键&#xff0c;而不是将数据值与独立的键相关联。 默认情况下&#xff0c;TSet 不支持重…

iOS 18.2开发者预览版 Beta 1版本发布,欧盟允许卸载应用商店

苹果今天为开发人员推送了iOS 18.2开发者预览版 Beta 1版本 更新&#xff08;内部版本号&#xff1a;22C5109p&#xff09;&#xff0c;本次更新距离上次发布 Beta / RC 间隔 2 天。该版本仅适用于支持Apple Intelligence的设备&#xff0c;包括iPhone 15 Pro系列和iPhone 16系…

【设计模式系列】观察者模式

一、什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式也被称为发布-订阅模式&…

「重磅」中国电信数据湖+数据中台实施方案(附60页方案)

来源:公众号-数据分析小兵 作者按 哈喽,大家好,我是数据分析小兵,今天小兵向大家分享中国电信基于数据湖的数据中台实施方案。 方案核心内容一:数据湖的搭建与实施 数据湖是一套针对海量多源异构数据,具备数据采集、数据存储、数据计算、数据访问、数据管理的技术架构…

1.CentOS安装

CentOS安装 新建虚拟机 选择安装方式 指定镜像方式 选择操作系统类型 设置虚拟机名称和位置 指定磁盘大小 点击“自定义硬件” 指定内存大小 指定镜像位置 点击“开启此虚拟机” 选择“Install CentOS 7”并回车 选择语言 选择安装“GNOME桌面”环境 配置安装位置 配置网络和…

springboot高校科研项目和课题管理平台-计算机毕业设计源码18198

摘要 随着科技的快速发展和高校科研水平的持续提高&#xff0c;科研项目和课题的管理逐渐变得复杂多样。传统的管理方式&#xff0c;如使用纸质文档或简单的电子表格进行记录&#xff0c;已经无法满足现代高校科研管理的需求。这不仅影响了科研工作的效率&#xff0c;还可能导致…

CentOS 7(Linux)详细安装教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 一、CentOS镜像的下载&#xff08;准备工作&#xff09; 我选择的是其他镜像源的下载地址&#xff1a; Index of /centos-vault/7.6.1810/isos/x86_64/ | 南阳理工学院开源镜…

8个方法教会你提高企业培训效率

培训成本是企业中的一个复杂问题。它完全取决于课程内容、培训方法以及成本效益。在计算培训费用时&#xff0c;公司会面临许多关于包括哪些内容、如何进行以及假设情景的问题。 企业员工培训的每个方面都会产生自己的成本。例如&#xff1a; 地点&#xff1a;我们专门找个培训…

冒泡排序(Python)

冒泡排序&#xff1a;依次比较相邻的两个数&#xff0c;将大数放在后面&#xff0c;小数放在前面。 n个数排序共需进行n-1趟&#xff0c;第一趟排序结束时&#xff0c;最后一个元素为所有元素中的最大值。 冒泡排序的原理 1&#xff09;比较相邻元素&#xff1a;如果第一个比…

婚纱相册必须去摄影店吗?其实自己会拍照就能实现,性价比更高

一直以来&#xff0c;婚纱照都是新人们婚礼筹备中不可或缺的部分。然而&#xff0c;高昂的摄影店价格让不少新人望而却步。其实&#xff0c;只要掌握一些拍照技巧&#xff0c;自己在家就能制作出独一无二的婚纱相册&#xff0c;不仅性价比超高&#xff0c;还能留下更多珍贵的回…

Android 中的串口开发

一&#xff1a;背景 本文着重讲安卓下的串口。 由于开源的Android在各种智能设备上的使用越来越多&#xff0c;如车载系统等。在我们的认识中&#xff0c;Android OS的物理接口一般只有usb host接口和耳机接口&#xff0c;但其实安卓支持各种各样的工业接口&#xff0c;如HDM…

条码检测系统——基于MATLAB的一维条码识别

摘 要&#xff1a;条码技术是如今应用最广泛的识别和输入技术之一&#xff0c;由于其包含的信息量大&#xff0c;识别错误率低而在各个方面得到很大的重视。它发展迅速并被广泛应用于于工业、商业、图书出版、医疗卫生等各行各业。由我国目前发展现状来看&#xff0c;条码的正…