Python 文件上传(Socket)
1.服务器端
1 #__author: Lobin 2 #__date: 2018/1/21 3 import socket 4 import os 5 BASE_DIR=os.path.dirname(os.path.abspath(__file__)) 6 sk=socket.socket() 7 address=('127.0.0.1',8080) 8 sk.bind(address) 9 sk.listen(3) 10 while True: 11 conn,add=sk.accept() 12 print(conn,add) 13 while True: 14 data=conn.recv(1024) 15 cmd,filename,filesize=str(data,'utf8').split('|') 16 path=os.path.join(BASE_DIR,'Up',filename) 17 filesize=int(filesize) 18 19 f=open(path,'ab') 20 has_recv=0 21 while has_recv!=filesize: 22 data=conn.recv(1024) 23 f.write(data) 24 has_recv+=len(data) 25 f.close() 26 print('接收成功') 27 sk.close()
解析:约定服务器与客户端的上传格式为第一次发送文件大小信息,二次发送文件
1.1 cmd,filename,filesize=str(data,'utf8').split('|') 将客户端传送来的消息以“|”分割开来获取文件信息的命令cmd、文件名称filename、文件大小filesize
1.2 path=os.path.join(BASE_DIR,'Up',filename) 用路径拼接函数将本地路径BASE_DIR、文件夹Up、和文件名称拼接为服务器本地绝对路径
1.3 filesize=int(filesize) 将字符号转换为int
1.4 打开文件接收数据以bytes类型接收并写入ab模式
2.客户端
1 #__author: Lobin 2 #__date: 2018/1/21 3 import socket 4 import os 5 BASE_DIR=os.path.dirname(os.path.abspath(__file__)) 6 sk=socket.socket() 7 address=('127.0.0.1',8080) 8 sk.connect(address) 9 while True: 10 inp=input('>>>').strip() 11 cmd,path=inp.split('|') 12 path=os.path.join(BASE_DIR,path) 13 file_name=os.path.basename(path) 14 file_size=os.stat(path).st_size 15 file_info='post|%s|%s'%(file_name,file_size) 16 sk.sendall(bytes(file_info,'utf8')) 17 18 f=open(path,'rb') 19 has_sent=0 20 while has_sent!=file_size: 21 data=f.read(1024) 22 sk.sendall(data) 23 has_sent+=len(data) 24 f.close() 25 print('上传成功') 26 sk.close()
解析:约定服务器与客户端的上传格式为第一次发送文件大小信息,二次发送文件
2.1 path=os.path.join(BASE_DIR,'Up',filename) 用路径拼接函数将本地路径BASE_DIR、文件夹Up、和文件名称拼接为服务器本地绝对路径
2.2 file_size=os.stat(path).st_size 利用次函数获取文件的大小
2.3 打开文件发送数据以bytes类型读取并发送rb模式
注意:当操作完文件后,需要将其 关闭,f.close()否则无法再文件打开的模式下再次打开查看文件内容
浙公网安备 33010602011771号