python ftp server库_基于Python的开发ftp(含数据库、含多线程、含socketserver)

基于

服务器端:

import pymysql

import socketserver

import time

import os

xieyi='''

+----------------------+

1.想服务器端上传文件

2.从服务器端下载文件

+----------------------+

'''

login='''

+----------------------+

+ 身份验证 +

+ 请输入用户名和密码: +

+----------------------+

'''

#实例化

class MyTCPhandler(socketserver.BaseRequestHandler):

def handle(self):

try:

conn = pymysql.connect(

host='localhost',

user='root',

password='cl19970312',

db='ftp',

charset='utf8',

)

except pymysql.Error as e:

print("数据库连接失败", e)

exit()

finally:

root_path = 'E:\堡垒机开发\server//'

print("数据库连接成功")

self.cur = conn.cursor()

while True:

try:

self.login_yanzheng = False

self.data=self.request.recv(1024)

print('{}:{}wrote:'.format(self.client_address[0],self.client_address[1]))

print("data:",self.data.decode('utf-8'))

if check_connect(self.data,self.cur):

print("登陆成功")

id=check_connect(self.data,self.cur)

self.login_yanzheng=True

self.request.send("登陆成功".encode('utf-8'))

if self.request.recv(1024).decode('utf-8')=='1':

print("准备接收文件")

self.request.send("OK".encode('utf-8'))

data=self.request.recv(10000000)

save_data(data,id,self.cur)

self.request.close()

conn.commit()

else:

print("准备向客户端传送文件")

data=query(id,self.cur)

if not data:

self.request.send("未找到您的上传记录".encode('utf-8'))

print("与 {} 断开连接".format(self.client_address[0]))

self.request.close()

else:

self.request.send(data.encode('utf-8'))

request=self.request.recv(1024).decode('utf-8')

if isfile(root_path+request+'.jpg'):

data=readfile(root_path+request+'.jpg')

self.request.send(data)

else:

self.request.send('')

else:

print("登陆失败")

self.login_yanzheng=False

self.request.send("登陆失败,用户名不存在".encode('utf-8'))

except ConnectionError as e:

print(e)

break

except:

break

def check_connect(data,cur):

data=data.decode('utf-8').split()

id,password=data[0],data[1]

sql='select * from user where id={};'.format(id)

cur.execute(sql)

results=cur.fetchall()

if results[0][0]==id and results[0][1]==password:

return id

else:

return None

def isfile(filename):

result=os.path.exists(filename)

return result

def readfile(filename):

with open(filename,'rb') as f:

data=f.read()

return data

def save_data(data,id,cur):

today_now = time.strftime('%Y%m%d%H%M%S')

filename=id+today_now+'.jpg'

root_path='E:\堡垒机开发\server//'

#os.makedirs(root_path)

with open(root_path+filename,'wb') as f:

f.write(data)

sql='insert into file values("{}","{}");'.format(id,filename.split('.')[0])

print(sql)

cur.execute(sql)

print("文件上传成功,共 {} 字节".format(len(data)))

def query(id,cur):

try:

sql='select filename from file where id="{}";'.format(id)

cur.execute(sql)

results=cur.fetchall()

data=''

for result in results:

data+=str(result)+','

return data

except pymysql.Error as e:

print(e)

return None

if __name__=='__main__':

HOST,PORT='localhost',8080

server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPhandler)

server.serve_forever()

客户端:

from socket import *

import time

import os

client=socket()

client.connect(('localhost',8080))

xieyi='''

+----------------------+

1.想服务器端上传文件

2.从服务器端下载文件

+----------------------+

'''

login='''

+----------------------+

+ 身份验证 +

+ 请输入用户名和密码: +

+----------------------+

'''

def handle_data():

is_quit = False

while True:

if is_quit:

break

send_mas = input(xieyi).strip()

if send_mas in ['1','2']:

if send_mas=="1":

client.send(send_mas.encode('utf-8'))

if client.recv(1024).decode('utf-8')=='OK':

while True:

filename=input("请输入文件名:").strip()

root_path ='E:\堡垒机开发\client//'

print(root_path+filename)

if isfile(root_path+filename):

print("文件存在")

client.send(readfile(root_path+filename))

print("文件发送成功,共 {} 字节".format(len(readfile(root_path+filename))))

is_quit=True

exit()

break

else:

print("文件不存在")

continue

else:

break

else:

client.send(send_mas.encode('utf-8'))

data=client.recv(1024)

if data=='未找到您的上传记录':

print("未找到上传记录")

client.close()

else:

print("一共有以下文件可以下载")

print(data.decode('utf-8'))

data=input("请输入您选择的文件>>").strip()

client.send(data.encode('utf-8'))

data=client.recv(1000000)

if data:

save_file(data)

break

else:

print("文件被删除")

else:

print("输入错误,请重新输入")

def isfile(filename):

result=os.path.exists(filename)

return result

def readfile(filename):

with open(filename,'rb') as f:

data=f.read()

return data

def main():

print(login)

send_mas = input(">>").strip()

client.send(send_mas.encode('utf-8'))

recv_data = client.recv(1024)

if recv_data.decode('utf-8') == '登陆成功':

print("服务端允许获得连接")

handle_data()

else:

print("服务器端不允许获得连接")

def save_file(data):

today_now = time.strftime('%Y%m%d%H%M%S')

filename =today_now + '.jpg'

root_path = 'E:\堡垒机开发\client//'

# os.makedirs(root_path)

with open(root_path + filename, 'wb') as f:

f.write(data)

print("文件保存成功!共 {} 字节".format(len(data)))

if __name__=='__main__':

main()

readme:

ftp:

身份验证:

成功:

上传文件

保存文件(server)

下载文件

保存文件(client)

失败:

退出

mysql:

打开命令行输入

mysql -u root -p→

→password→

show databases;

create database ftp;

use ftp;

create table user(id varchar(40) primary key,

password varchar(40));

insert into user value('000001','123456'),('000002','123456'),('000003','654321');

文件目录:

ff094e65.png

实现效果:

1.向服务器端发送文件

ff094e65-1.png

2.向服务器端下载本人上传的文件

ff094e65-2.png

ff094e65-3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值