python入门第二十八天——文件上传

服务端:

 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/1 
 6 '''
 7 import subprocess
 8 import socket,os
 9 
10 # 创建一个socket:
11     #family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None
12     #创建Socket时,AF_INET指定使用IPv4协议,
13     # 如果要用更先进的IPv6,就指定为AF_INET6
14     # AF_UNIX Unix不同进程之间的通信
15     #  SOCK_STREAM指定使用面向流的TCP协议 SOCK_DGRAM UDP协议
16 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
17 print(s)
18 address=('127.0.0.1',8000)
19 #建立连接
20 s.bind(address)
21 #监听设置端口等待客户端的请求数量
22 s.listen(3)
23 
24 
25 print('等待...........')
26 BASE_DIR=os.path.dirname(os.path.abspath(__file__))
27 
28 while True:
29     # accept 阻塞
30     conn, addr = s.accept()
31     print(addr)
32     while True:
33         data=conn.recv(1024)
34         cmd,filename,filesize=str(data,"utf8").split("|")
35         path=os.path.join(BASE_DIR,"img",filename)
36         filesize=int(filesize)
37 
38         f=open(path,"wb")
39 
40         get_sent=0
41         while get_sent != filesize:
42             data=conn.recv(1024)
43             get_sent+=len(data)
44             f.write(data)
45         print("接受完毕。")
46         f.close()
47 
48 
49 s.close()

客户端:

 1 #!/usr/bin/env python3
 2 # -*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/1 
 6 '''
 7 import socket,os,sys
 8 
 9 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
10 print(sck)
11 address = ('127.0.0.1', 8000) #192.168.0.103
12 sck.connect(address)
13 
14 BASE_DIR=os.path.dirname(os.path.abspath(__file__))
15 while True:
16     inp = input(">>>").strip()#post|kanqingzi.jpg
17 
18     cmd,path=inp.split("|")
19     path=os.path.join(BASE_DIR,path)#拼接路径
20 
21     filename=os.path.basename(path)#需要文件名字
22     filesize=os.stat(path).st_size#需要文件大小
23     #文件打包
24     file_info="post|%s|%s"%(filename,filesize)#字符串拼接
25     sck.sendall(bytes(file_info,"utf8"))
26 
27     with open(path,"rb") as f:
28         has_sent=0
29         while has_sent !=filesize:
30             data=f.read(1024)
31             sck.sendall(data)
32             has_sent+=len(data)
33     print("上传成功!!!")
34 
35 sck.close()


练习:远程控制对方电脑,并将对方电脑里面的图片发送过来。

 客户端::

 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/2 
 6 '''
 7 import socket,os,re
 8 
 9 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
10 print(sck)
11 address = ('127.0.0.1', 8000) #192.168.0.103
12 sck.connect(address)
13 
14 BASE_DIR=os.path.dirname(os.path.abspath(__file__))
15 while True:
16     inp = input(">>>").strip()#post|kanqingzi.jpg    load|jpg
17     if "|" in inp:
18         cmd,path=inp.split("|")
19 
20         if cmd=="post":  #上传文件post|jgp
21             path=os.path.join(BASE_DIR,path)#拼接路径
22 
23             filename=os.path.basename(path)#需要文件名字
24             filesize=os.stat(path).st_size#需要文件大小
25             #文件打包
26             file_info="post|%s|%s"%(filename,filesize)#字符串拼接
27             sck.sendall(bytes(file_info,"utf8"))
28 
29             with open(path,"rb") as f:
30                 has_sent=0
31                 while has_sent !=filesize:
32                     data=f.read(1024)
33                     sck.sendall(data)
34                     has_sent+=len(data)
35             print("图片%s上传成功!!!"%filename)
36         elif cmd=="load": #下载文件 #load|././././xx.jpg  要输入图片绝对路径
37             sck.send(inp.encode('utf-8'))
38             data=sck.recv(1024)
39             cmd, filename, filesize = str(data,"utf8").split("|")
40             if cmd == "load":  # 再次确认是下载命令
41                 path = os.path.join(BASE_DIR, "img_recv", filename)
42                 filesize = int(filesize)
43                 f = open(path, "wb")
44                 get_sent = 0
45                 while get_sent != filesize:
46                     data_s = sck.recv(1024)
47                     get_sent += len(data_s)
48                     f.write(data_s)
49                 print("接受图片%s。" % filename)
50                 f.close()
51 
52 
53     else:           # 远程操控,给服务端输入命令
54         sck.send(inp.encode('utf-8'))
55         result_len = int(str(sck.recv(1024), "utf-8"))  # 先接受二进制的长度
56         # sck.send("")
57         print(result_len)
58 
59         data = bytes()
60         while len(data) != result_len:
61             recv = sck.recv(1024)
62             data += recv
63         print(str(data, "gbk", errors="ignore"))
64 
65 sck.close()

服务端:

 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/2 
 6 '''
 7 import subprocess
 8 import socket,os
 9 
10 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
11 print(s)
12 address=('127.0.0.1',8000)
13 s.bind(address)
14 s.listen(3)
15 print('等待...........')
16 BASE_DIR=os.path.dirname(os.path.abspath(__file__))
17 
18 while True:
19     conn, addr = s.accept()
20     print(addr)
21     while True:
22 ################################接受数据  cd   post|.....  #####################################
23         try:
24             data = conn.recv(1024)
25         except Exception:
26             break
27         if not data:
28             conn.close()
29             break
30         data_l=str(data,"utf8")
31         if "|" in data_l:
32             if len(data_l.split("|"))==3:#切开后有三个参数
33                 cmd,filename,filesize=data_l.split("|") #有时候两个参数,有时候三个参数
34     ################################ 判断是下载 load 还是上传 post                 ###########################################
35                 if cmd=="post":  #上传
36                     path=os.path.join(BASE_DIR,"img",filename)
37                     filesize=int(filesize)
38                     f=open(path,"wb")
39                     get_sent=0
40                     while get_sent != filesize:
41                         data_s=conn.recv(1024)
42                         get_sent+=len(data_s)
43                         f.write(data_s)
44                     print("接受图片%s。"%filename)
45                     f.close()
46             elif len(data_l.split("|"))==2:  #下载
47                 cmd, path = data_l.split("|")###得到load | 图片绝对路径
48                 if cmd=="load":
49                     filename = os.path.basename(path)  # 需要文件名字
50                     filesize = os.stat(path).st_size  # 需要文件大小
51                     # 文件打包
52                     file_info = "load|%s|%s" % (filename, filesize)  # 字符串拼接
53                     conn.sendall(bytes(file_info, "utf8"))
54                     with open(path, "rb") as f:
55                         has_sent = 0
56                         while has_sent != filesize:
57                             data = f.read(1024)
58                             conn.sendall(data)
59                             has_sent += len(data)
60                     print("图片%s上传成功!!!" % filename)
61         else:             #执行cmd命令  远程控制
62             obj = subprocess.Popen(data_l, shell=True, stdout=subprocess.PIPE)
63 
64             info = obj.stdout.read()  # 取到执行后得到的结果二进制
65             result_len = bytes(str(len(info)), "utf8")
66             conn.send(result_len)
67 
68             conn.sendall(info)
69 
70 
71 
72 s.close()
原文地址:https://www.cnblogs.com/Mengchangxin/p/9406496.html