This article mainly introduces a simple local file upload server example written in python3. It has a certain reference value. Now I share it with everyone. Friends in need can refer to it
Python is a very fun thing ? Okay, I just said it casually. Anyway, for various reasons (actually I don’t know what it is), I briefly learned python, and then wrote a small toy for uploading files to the server to practice.
The approximate function is as follows:
1. Get the local file list (including folders)
2. Check the server whether it exists on the server. If it does not exist, upload it directly. If it exists, the folder will be ignored. The files will be compared in size. If the sizes are inconsistent, they will be overwritten. Finally, check whether there are files on the server that are not available locally. If they exist, delete them.
3. Later, it was added Ignore the list, ignore the file type
4, and then added restart tomcat, but this function has not been tested
This is probably what it looks like, oh, lost code, lost code
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import os.path import paramiko import datetime import re # 配置属性 config = { #本地项目路径 'local_path' : '', # 服务器项目路径 'ssh_path' : '', # 项目名 'project_name' : '', # 忽视列表 'ignore_list' : [], # ssh地址、端口、用户名、密码 'hostname' : '', 'port' : 22, 'username' : '', 'password' : '', # 是否强制更新 'mandatory_update' : False, # 更新完成后是否重启tomcat 'restart_tomcat' : False, # tomcat bin地址 'tomcat_path' : '', # 被忽略的文件类型 'ignore_file_type_list' : [] } # 检查文件夹是否存在,不存在则创建 def check_folder(path): stdin, stdout, stderr = ssh.exec_command('find ' + path) result = stdout.read().decode('utf-8') if len(result) == 0 : print('目录 %s 不存在,创建目录' % path) ssh.exec_command('mkdir ' + path) print('%s 创建成功' % path) return 1 else: print('目录 %s 已存在' % path) return 0 # 检查文件是否存在,不存在直接上传,存在检查大小是否一样,不一样则上传 def check_file(local_path, ssh_path): # 检查文件是否存在,不存在直接上传 stdin, stdout, stderr = ssh.exec_command('find ' + ssh_path) result = stdout.read().decode('utf-8') if len(result) == 0 : sftp.put(local_path,ssh_path) print('%s 上传成功' % (ssh_path)) return 1 else: # 存在则比较文件大小 # 本地文件大小 lf_size = os.path.getsize(local_path) # 目标文件大小 stdin, stdout, stderr = ssh.exec_command('du -b ' + ssh_path) result = stdout.read().decode('utf-8') tf_size = int(result.split('\t')[0]) print('本地文件大小为:%s,远程文件大小为:%s' % (lf_size, tf_size)) if lf_size == tf_size: print('%s 大小与本地文件相同,不更新' % (ssh_path)) return 0 else: sftp.put(local_path,ssh_path) print('%s 更新成功' % (ssh_path)) return 1 # 上传流程开始 print('上传开始') begin = datetime.datetime.now() # 文件夹列表 folder_list = [] # 文件列表 file_list = [] # ssh上文件列表 ssh_file_list = [] for parent,dirnames,filenames in os.walk(config['local_path']+config['project_name']): #初始化文件夹列表 for dirname in dirnames: p = os.path.join(parent,dirname) folder_list.append(p[p.find(config['project_name']):]) #初始化文件列表 for filename in filenames: if config['ignore_list'].count(filename) == 0: p = os.path.join(parent,filename) file_list.append(p[p.find(config['project_name']):]) print('共有文件夹%s个,文件%s个' % (len(folder_list),len(file_list))) # ssh控制台 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=config['hostname'], port=config['port'], username=config['username'], password=config['password']) # ssh传输 transport = paramiko.Transport((config['hostname'],config['port'])) transport.connect(username=config['username'],password=config['password']) sftp = paramiko.SFTPClient.from_transport(transport) # 检查根目录是否存在 root_path = config['ssh_path'] + config['project_name'] stdin, stdout, stderr = ssh.exec_command('find ' + root_path) result = stdout.read().decode('utf-8') if len(result) == 0 : print('目录 %s 不存在,创建目录' % root_path) ssh.exec_command('mkdir ' + root_path) print('%s 创建成功' % root_path) else: print('目录 %s 已存在,获取所有文件' % root_path) ssh_file_list = re.split('\n',result) # 检查文件夹 create_folder_num = 0 for item in folder_list: target_folder_path = config['ssh_path'] + item create_folder_num = create_folder_num + check_folder(target_folder_path) # 检查文件 update_file_num = 0 for item in file_list: if config['ignore_file_type_list'].count(os.path.splitext(item)[1]) == 0: local_file_path = config['local_path'] + item target_file_path = config['ssh_path'] + item if config['mandatory_update']: sftp.put(local_file_path,target_file_path) print('%s 强制更新成功' % (target_file_path)) update_file_num = update_file_num + 1 else: update_file_num = update_file_num + check_file(local_file_path, target_file_path) else: print('%s 在被忽略文件类型中,所以被忽略' % item) # 检查ssh是否有需要删除的文件 delete_file_num = 0 for item in ssh_file_list: temp = item[item.find(config['project_name']):] if folder_list.count(temp) == 0 and file_list.count(temp) == 0 and temp != config['project_name'] and temp != '': print('%s 在本地不存在,删除' % item) ssh.exec_command('rm -rf ' + item) delete_file_num = delete_file_num + 1 end = datetime.datetime.now() print('本次上传结束:创建文件夹%s个,更新文件%s个,删除文件%s个,耗时:%s' % (create_folder_num, update_file_num, delete_file_num, end-begin)) if config['restart_tomcat']: print('关闭tomcat') ssh.exec_command('sh ' + config['tomcat_path'] + 'shutdown.sh') print('启动tomcat') ssh.exec_command('sh ' + config['tomcat_path'] + 'startup.sh') # 关闭连接 sftp.close() ssh.close()
Finally, a mandatory update is added, that is, no matter what, as long as it is not in the ignore list, it will be directly uploaded and overwritten. There may be problems when updating files by comparing sizes. For example, if I change 1 to 2, it cannot be compared by file size. If I have time later, I will consider pulling down the git update record or other solutions.
Related recommendations:
Easy to build your own server with Python3
##
The above is the detailed content of Simple local file upload server example written in python3. For more information, please follow other related articles on the PHP Chinese website!

wpsystem文件夹是windows应用文件夹;创建WpSystem文件夹是为了存储某些特定“Microsoft Store”应用程序的数据,因此建议不要删该文件夹,因为删除之后就无法使用指定的应用。

winreagent是在系统更新或升级的过程中创建的文件夹;该文件夹中通常包含临时文件,当更新或升级失败时,系统将通过还原先前创建的临时文件来回滚到执行更新或升级过程之前的版本。

baidunetdiskdownload是百度网盘默认下载文件的文件夹;百度网盘是百度推出的一项云存储服务,只要下载东西到百度网盘里,都会默认保存到这个文件夹中,并且可跨终端随时随地查看和分享。

“usmt.ppkg”是windows自带的系统还原功能的系统备份文件;Windows系统还原是在不需要重新安装操作系统,也不会破坏数据文件的前提下使系统回到原有的工作状态,PBR恢复功能的备份文件就是“usmt.ppkg”。

mobileEmuMaster是手机模拟大师的安装文件夹。手机模拟大师是PC电脑模拟运行安卓系统的免费模拟器程序,一款可以让用户在电脑上运行手机应用的软件,支持安装安卓系统中常见的apk执行文件,支持QQ、微信等生活常用应用,达到全面兼容的效果。

kml是谷歌公司创建的一种地标性文件格式;该文件用于记录某一地点或连续地点的时间、经度、纬度、海拔等地理信息数据,可以被“Google Earth”和“Google Maps”识别并显示。

备份文件的扩展名通常是“.bak”;bak文件是一个备份文件,这类文件一般在'.bak前面加上应该有原来的扩展名,有的则是由原文件的后缀名和bak混合而成,在生成了某种类型的文件后,就会自动生成它的备份文件。

config是软件或者系统中的配置文件,不可以删除;该文件是在用户开机时对计算机进行初始化设置,也就是用户对系统的设置都由它来对计算机进行恢复,因此不能删除软件或者系统中的config配置文件,以免造成错误。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

SublimeText3 English version
Recommended: Win version, supports code prompts!

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools
