python利用socket写一个文件上传

1.先将一张图片拖入‘文件上传’的目录下,利用socket把这张图片写到叫‘yuan’的文件中

2.代码:

 1 #模拟服务端
 2 import  subprocess
 3 import os
 4 import  socket
 5 sk=socket.socket()
 6 print(sk)
 7 address=('127.0.0.1',8080)
 8 sk.bind(address)
 9 BASE_DIR=os.path.dirname(os.path.abspath(__file__))#获取绝对路径
10 
11 sk.listen(3)
12 print('waiting......')
13 # conn=sk.accept()
14 # print(conn)
15 
16 while 1:
17     conn,addr=sk.accept()
18     while True:
19      data=conn.recv(1024)
20      cmd,filename,filesize=str(data,'utf8').split('|')
21      path=os.path.join(BASE_DIR,'yuan',filename)#拼接出要写入的文件地址
22      print(path)
23      filesize=int(filesize)
24 
25      f=open(path,'ab')
26      has_receiv=0
27      while has_receiv!=filesize:
28          data=conn.recv(1024)
29          f.write(data)
30      f.close()
31 sk.close()
模拟客户端
import  socket
import  os
sk=socket.socket()
#print(sk)
address=('127.0.0.1',8080)
sk.connect(address)
BASE_DIR=os.path.dirname(os.path.abspath(__file__))#获取相对路径
print(BASE_DIR)
while 1:
   inp =input('>>>>>').strip()#post|图片.jpg
   cmd,path=inp.split('|')#字符分割放入两变量中
   path=os.path.join(BASE_DIR,path)#join在文件最末尾处拼接字符上去
   #print('path',path)
   filename=os.path.basename(path)#获取文件名,返回path最后的文件名。如何path以/或结尾,那么就会返回空值
   file_size=os.stat(path).st_size#获取文件大小(os.stat() 方法用于在给定的路径上执行一个系统 stat 的调用,st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。)
   file_info='post|%s|%s'%(filename,file_size)#将文件的所有数据(文件名,文件大小)做成一个字符
   sk.sendall(bytes(file_info,'utf8 '))

   has_sent = 0
   # with open(path,'rb') as f:
   #       data=f.read(1024)
   #       sk.sendall(data)
   #       has_sent+=len(data)
   # f.close()
   # print('上传成功')

  #第二种读取图片文件的信息
   fa=open(path,'rb')
   while has_sent!=file_size:
      data=fa.read(1024)
      sk.send(data)
      has_sent+=len(data)
   fa.close()
   print('上传成功')

sk.close()

3效果:

原文地址:https://www.cnblogs.com/lanyinhao/p/9214035.html