Python(文件上传)

day26

通过socket上传文件。

post_client.py

 1 import socket
 2 import os
 3 sk = socket.socket()
 4 print(sk)
 5 address = ('127.0.0.1', 8003)
 6 sk.connect(address)
 7 
 8 BASE_DIR = os.path.dirname(os.path.abspath(__file__))#当前执行文件路径
 9 
10 while True:
11     inp = input('>>>').strip()#post abc.png
12     cmd, path = inp.split('|') #post, 需传送的文件即abc.png
13     path = os.path.join(BASE_DIR, path)#完整的路径拼接
14     filename = os.path.basename(path)#文件名字
15     file_size = os.stat(path).st_size#查看文件大小
16 
17     file_info = 'post|%s|%s'%(filename, file_size)#文件信息
18     sk.sendall(bytes(file_info, 'utf8'))
19 
20     f = open(path, 'rb')#字节b为bytes
21     has_sent = 0
22     while has_sent != file_size:#相同大小说明全部上传
23         data = f.read(1024)#取一部分发
24         sk.sendall(data)
25         has_sent += len(data)
26 
27     f.close()
28     print('上传成功')
29 
30 
31 sk.close()
32 #print(sk)

post_server.py

 1 import socket
 2 import subprocess
 3 sk = socket.socket()#创建socket
 4 import os
 5 print(sk)
 6 
 7 address = ('127.0.0.1', 8003)#本机地址
 8 sk.bind(address)#为socket绑定IP和端口号
 9 
10 sk.listen(3)#限制排队的个数
11 print('waiting......')
12 BASE_DIR = os.path.dirname(os.path.abspath(__file__))
13 
14 while True:
15     conn, addr = sk.accept()
16 
17     while True:
18         data = conn.recv(1024)
19         cmd, filename, filesize = str(data, 'utf8').split('|')#获得信息
20         path = os.path.join(BASE_DIR, 'far', filename)#新路径
21         filesize = int(filesize)
22 
23         f = open(path, 'ab')
24         has_receive = 0
25         #接收
26         while has_receive != filesize:
27             data = conn.recv(1024)
28             f.write(data)
29             has_receive += len(data)
30 
31         f.close()#不能忘记关闭,否则出错
32         print('接收完毕!')
33 sk.close()#全关

执行post_server.py,再执行post_client.py,在client中输入post|abc.png进行上传。

(其中abc.png和两个执行文件同级,在以上三个文件相同位置还存在一个far包)

原文地址:https://www.cnblogs.com/112358nizhipeng/p/9892128.html