FTP上传下载文件(函数简易版)
FTP上传下载文件(函数简易版)
# 服务端
import socket
import json
import hashlib
import struct
import os
user_dic = {
'太上老君': '123456',
'元始天尊': '123456',
'通天教主': '123456'
}
server = socket.socket()
server.bind(('192.168.13.19', 2021))
server.listen(5)
conn, addr = server.accept()
def login(): # 登录
time = 3
while time > 0:
username, psw = conn.recv(1024).decode('utf-8').split('|')
if user_dic.get(username) == psw:
conn.send('True'.encode('utf-8'))
return True
else:
time -= 1
conn.send(str(time).encode('utf-8'))
return False
def up(): # 上传
while 1:
len_head_dic = struct.unpack('i', conn.recv(4))[0]
head_dic = json.loads(conn.recv(len_head_dic).decode('utf-8'))
file_name = head_dic['file_name']
file_md5 = head_dic['file_md5']
file_size = head_dic['file_size']
file_path = os.path.join(os.path.dirname(__file__), '上传/', file_name)
with open(file_path, mode='wb') as f:
md5 = hashlib.md5()
len_data = 0
while len_data < file_size:
data = conn.recv(1024)
len_data += len(data)
md5.update(data)
f.write(data)
data_md5 = md5.hexdigest()
if data_md5 == file_md5:
conn.send('True'.encode('utf-8'))
return True
else:
conn.send('False'.encode('utf-8'))
def down(): # 下载
file_path = os.path.join(os.path.dirname(__file__), '上传/')
file_lst = os.listdir(file_path)
file_show = ''
for n, file in enumerate(file_lst, 1):
file_show += f'序号:{n}\t文件名:{file}\n'
to_client = f'可下载文件:\n{file_show}'.encode('utf-8')
conn.send(to_client)
while 1:
from_client = conn.recv(1024).decode('utf-8')
try:
with open(os.path.join(file_path, file_lst[int(from_client) - 1]), mode='rb') as f:
file_size = 0
md5 = hashlib.md5()
while 1:
data = f.read(1024)
if data:
md5.update(data)
file_size += len(data)
else:
break
file_md5 = md5.hexdigest()
conn.send('True'.encode('utf-8'))
except Exception:
conn.send('False.'.encode('utf-8'))
continue
else:
head_dic = {
'file_md5': file_md5,
'file_name': file_lst[int(from_client) - 1],
'file_size': file_size
}
head_dic_json_bytes = json.dumps(head_dic).encode('utf-8')
len_head_dic_bytes = struct.pack('i', len(head_dic_json_bytes))
conn.send(len_head_dic_bytes)
conn.send(head_dic_json_bytes)
with open(os.path.join(file_path, file_lst[int(from_client) - 1]), mode='rb') as f:
while 1:
data = f.read(1024)
if data:
conn.send(data)
else:
return True
def run(): # 主循环
if login():
while 1:
from_client = conn.recv(1024).decode('utf-8')
if from_client == '1':
up()
elif from_client == '2':
down()
elif from_client == '3':
break
if __name__ == '__main__':
run()
# 客户端
import socket
import hashlib
import json
import struct
import os
client = socket.socket()
client.connect(('192.168.13.19', 2021))
def login(): # 登录
while 1:
username = input('请输入账号:').strip()
psw = input('请输入密码:').strip()
to_server = f'{username}|{psw}'.encode('utf-8')
client.send(to_server)
from_server = client.recv(1024).decode('utf-8')
if from_server == 'True':
return True
elif from_server == '0':
return False
else:
print(f'账号或密码错误,还有{from_server}次机会')
def up(): # 上传
print('欢迎进入上传页面~~~~~~~~~~~~~~~~~~')
while 1:
file_path = input('请输入上传的文件路径:').strip()
try:
with open(file_path, mode='rb') as f:
file_size = 0
md5 = hashlib.md5()
while 1:
data = f.read(1024)
if data:
md5.update(data)
file_size += len(data)
else:
break
file_md5 = md5.hexdigest()
except Exception:
print('路径错误,请重新输入.')
continue
else:
head_dic = {
'file_md5': file_md5,
'file_name': os.path.basename(file_path),
'file_size': file_size
}
head_dic_json_bytes = json.dumps(head_dic).encode('utf-8')
len_head_dic_bytes = struct.pack('i', len(head_dic_json_bytes))
client.send(len_head_dic_bytes)
client.send(head_dic_json_bytes)
with open(file_path, mode='rb') as f:
while 1:
data = f.read(1024)
if data:
client.send(data)
else:
break
from_server = client.recv(1024).decode('utf-8')
if from_server == 'True':
print('上传成功.')
return True
else:
print('上传失败.')
def down(): # 下载
print('欢迎进入下载页面~~~~~~~~~~~~~~~~~~')
from_server = client.recv(1024).decode('utf-8')
print(from_server)
while 1:
choice = input('请输入选择的序号:').strip().encode('utf-8')
client.send(choice)
return_from_server = client.recv(1024).decode('utf-8')
if return_from_server == 'True':
len_head_dic = struct.unpack('i', client.recv(4))[0]
head_dic = json.loads(client.recv(len_head_dic).decode('utf-8'))
file_name = head_dic['file_name']
file_md5 = head_dic['file_md5']
file_size = head_dic['file_size']
file_path = os.path.join(os.path.dirname(__file__), '下载/', file_name)
with open(file_path, mode='wb') as f:
md5 = hashlib.md5()
len_data = 0
while len_data < file_size:
data = client.recv(1024)
len_data += len(data)
md5.update(data)
f.write(data)
data_md5 = md5.hexdigest()
if data_md5 == file_md5:
print('下载成功.')
return True
else:
print('下载失败.')
else:
print('输入错误,请重新输入.')
def run(): # 主循环
if login():
print('登陆成功~~~~~~~')
print('欢迎来到主页面~~~~~~')
while 1:
print('[1]上传\t[2]下载\t[3]退出')
choice = input('请输入选项:').strip()
client.send(choice.encode('utf-8'))
if choice == '1':
up()
elif choice == '2':
down()
elif choice == '3':
print('正在退出...')
break
else:
print('输入错误,请重新输入')
else:
print('登录失败,正在退出....')
if __name__ == '__main__':
run()
FTP上传下载文件(函数简易版)的更多相关文章
- java客户端调用ftp上传下载文件
1:java客户端上传,下载文件. package com.li.utils; import java.io.File; import java.io.FileInputStream; import ...
- FTP上传下载文件(面向对象版)
# 服务端 import socketserver import os import json import hashlib import struct class MySocketServer(so ...
- shell ftp上传下载文件
1. ftp自动登录批量下载文件. #####从ftp服务器上的/home/data 到 本地/home/databackup#### #!/bin/bash ftp -n<<! open ...
- shell脚本实现ftp上传下载文件
前段时间工作中需要将经过我司平台某些信息核验数据提取后上传到客户的FTP服务器上,以便于他们进行相关的信息比对核验.由于包含这些信息的主机只有4台,采取的策略是将生成的4个文件汇集到一个主机上,然后在 ...
- python实现支持目录FTP上传下载文件的方法
#!/usr/bin/env python # -*- coding: utf-8 -*- import ftplib import os import sys class FTPSync(objec ...
- 如何通过SecureCRT FTP上传下载文件
通过SecureCRT FTP方式从一台机器下载文件到另一台机器上: [root@TEST144239 ~]# ftp 10.30.1.25 Connected to 10.30.1.25 (10. ...
- ftp上传下载文件
客户端client: import os import json import socket import struct sk = socket.socket() sk.connect(('127.0 ...
- shell通过ftp实现上传/下载文件
直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...
- JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)
package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...
随机推荐
- hud2243 考研路茫茫——单词情结
考研路茫茫--单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- 240-4C6678_K7_DDR3_VPX高速信号处理板
4C6678_K7_DDR3_VPX高速信号处理板 4C6678_K7_DDR3_VPX板为基于TI 多核DSP TMS320C6678的通用处理板卡.板卡满足OpenVPX平台标准,可为雷达.电 ...
- 六 BASH 高级变量
高级变量分为三类 变量扩展 ${变量名} 例 ${filename} 大括号 命令替换 $(命令) $(ls /) 小括号 算术扩展 $((算数式)) $(( ...
- BZOJ1076/Luogu2473 奖励关(SCOI2008)状压DP+期望DP
题意:给n(n<=15)种宝物宝物有价值w且每个宝物有一个前置宝物(即你必须先吃过它的所有前置宝物至少一次才能吃该宝物),共有m轮游戏,每一轮会在n种宝物等概率选一个出来,因为宝物价值可正可负你 ...
- java 抽象的概念 抽象类的使用
package java10; /* 抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束 抽象类:抽象方法所在的类,必须是抽象类才行.在class之前写上abstract即可 如何 ...
- 用setInterval方法实现弹框闪烁
每次看到某电商平台的拼团提示会觉得很有趣也很方便,正好自己在学习小程序,那就想个法子实现一下这种效果咯~思虑了一下还是觉得用setIntercal方法比较简便(数据方面就先不考虑了,我这里只做一下表现 ...
- jQuery-Ajax请求Json数据并加载在前端页面,附视频教程讲解!
Ajax技术应用广泛,这种异步加载技术,无需刷新网页即可更新网站内容,全局或者局部均可,所以大家应该学会这种技巧,把技术用上来. 创建demo.json文件,用来做数据源: { "t ...
- SPOJ287 NETADMIN - Smart Network Administrator
传送门[洛谷] 常见套路? 关键点连新建汇点 流量1 源点1 原图中的边 二分流量. 二分+判满流 做完了. 附代码. #include<cstdio> #include<cstri ...
- after()和append()的区别、before()和prepend()区别、appendTo()和prependTo()、insertAfter()和insertBefore()
一.after()和before()方法的区别 after()——其方法是将方法里面的参数添加到jquery对象后面去: 如:A.after(B)的意思是将B放到A后面去: before( ...
- vue项目中axios的封装和使用
一.axios的功能特点 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 http请求 支持 Promise API 拦截请求和响应 转换请求和响应数据 支持多种请求 ...