• FTP各功能示例


     1 """
     2 # 第一个知识点    
     3 """
     4 import time
     5 print('
    80%',end='')
     6 time.sleep(2)
     7 print('
    90%',end='')
     8 """
     9 # 第二个知识点    %%
    10 """
    11 tpl = "进度条目前是%s%%" %(90,)
    12 print(tpl)
    13 """
    14 import time
    15 
    16 def func(size,total_size):
    17     val = int(size/total_size * 100)
    18     time.sleep(0.1)
    19     print('
    %s%%|%s' %(val,"#"*val,), end='')
    20 
    21 for i in range(101):
    22     func(i,100)
    进度条原理示例
      1 ftp-server端
      2 
      3 import os
      4 import json
      5 import socketserver
      6 import shutil
      7 
      8 CODE = {
      9     '1001':'上传文件,从头开始上传'
     10 }
     11 
     12 def recv_file(code, mode, recv_size, upload_file_size):
     13     
     14     response = {'code': code, 'size': recv_size}
     15     conn.sendall(json.dumps(response).encode('utf-8'))
     16 
     17     f = open(file_md5_path, mode)
     18     while recv_size < upload_file_size:
     19         data = conn.recv(1024)
     20         f.write(data)
     21         f.flush()
     22         recv_size += len(data)
     23     f.close()
     24 
     25     # 3.1.3 改名字
     26     shutil.move(file_md5_path, file_name_path)
     27 
     28 
     29 def upload(cmd_dict,conn,username):
     30     """
     31     服务端完成上传文件(含断点续传)
     32     :param cmd_dict:
     33     :param conn:
     34     :return:
     35     """
     36     # 2. 获取文件信息
     37     file_md5 = cmd_dict['md5']
     38     file_name = cmd_dict['file_name']
     39 
     40     file_md5_path = os.path.join('home', username, file_md5)
     41     file_name_path = os.path.join('home', username, file_name)
     42     upload_file_size = cmd_dict['size']
     43 
     44     # 3. 判断文件是否存在
     45     exist = os.path.exists(file_md5_path)
     46     if not exist:  # 不续传
     47         # 3.1.1 可以开始上传了,我已经准备好。
     48         recv_file('1001', 'wb', 0, upload_file_size)
     49 
     50     else:  # 续传
     51         # 3.2 续传+大小
     52         exist_size = os.stat(file_md5_path).st_size
     53     recv_file('1002', 'ab', exist_size, upload_file_size)
     54 
     55 class NbServer(socketserver.BaseRequestHandler):
     56     def handle(self):
     57         """
     58         self.request 是客户端的socket对象
     59         :return:
     60         """
     61         # 1. 接收命令
     62         upload_cmd_bytes = self.request.recv(8096)
     63         cmd_dict = json.loads(upload_cmd_bytes.decode('utf-8'))
     64 
     65         if cmd_dict['cmd'] == 'upload':
     66             upload(cmd_dict,self.request,'zhangzijian')
     67         elif cmd_dict['cmd'] == 'download':
     68             pass
     69 
     70 if __name__ == '__main__':
     71     server = socketserver.ThreadingTCPServer(('127.0.0.1',8001),NbServer)
     72     server.serve_forever()
     73 
     74 
     75 
     76 
     77 ftp-client端
     78 
     79 import os
     80 import socket
     81 import json
     82 import hashlib
     83 CODE = {
     84     '1001':'上传文件,从头开始上传'
     85 }
     86 
     87 
     88 def file_md5(file_path):
     89     """
     90     文件进行md5加密
     91     :param file_path:
     92     :return:
     93     """
     94     obj = open(file_path,'rb')
     95     m = hashlib.md5()
     96     for line in obj:
     97         m.update(line)
     98     obj.close()
     99     return m.hexdigest()
    100 
    101 def jdt(size,total_size):
    102     """
    103     显示进度条
    104     :return:
    105     """
    106     val = int(size / total_size * 100)
    107     print('
    %s%%|%s' % (val, "#" * val,), end='')
    108 
    109 def send_file(exist_size,file_total_size):
    110     """
    111     发送文件
    112     :param exist_size:开始读取字节的位置
    113     :param file_total_size: 文件总字节大小
    114     :return:
    115     """
    116     f = open(file_path, 'rb')
    117     f.seek(exist_size)
    118     send_size = exist_size
    119     while send_size < file_total_size:
    120         data = f.read(1024)
    121         sk.sendall(data)
    122         send_size += len(data)
    123         jdt(send_size,file_total_size)
    124     f.close()
    125     print('上传成功')
    126 
    127 def upload(file_path):
    128     """
    129     文件上传(含断点)
    130     :param file_path:
    131     :return:
    132     """
    133     file_md5_val = file_md5(file_path)
    134     file_name = os.path.basename(file_path)
    135     file_size = os.stat(file_path).st_size
    136 
    137     cmd_dict = {'cmd': 'upload', 'file_name': file_name, 'size': file_size, 'md5': file_md5_val}
    138     upload_cmd_bytes = json.dumps(cmd_dict).encode('utf-8')
    139     sk.sendall(upload_cmd_bytes)
    140 
    141     # 2. 等待服务端的响应
    142     response = json.loads(sk.recv(8096).decode('utf-8'))
    143     if response['code'] == 1001:
    144         send_file(0, file_size)
    145     else:
    146         # 断点续传
    147         exist_size = response['size']
    148         send_file(exist_size,file_size)
    149 
    150 sk = socket.socket()
    151 sk.connect(('127.0.0.1',8001))
    152 
    153 while True:
    154     # upload|文件路径
    155     user_input = input("请输入要执行的命令")
    156     # 1. 自定义协议{'cmd':'upload','file_path':'.....'}
    157     cmd,file_path = user_input.split('|',maxsplit=1)
    158     if cmd == 'upload':
    159         upload(file_path)
    160     elif cmd == 'download':
    161         pass
    文件上传(含断点续传)
  • 相关阅读:
    Vue自定义指令
    Vue实例生命周期
    Vue学习目录
    Vue表单控件绑定
    Vue事件处理
    Vue数组更新及过滤排序
    Vue模板逻辑
    Vue模板内容
    Vue实例对象的数据选项
    Vue组件基础用法
  • 原文地址:https://www.cnblogs.com/lbzbky/p/11715450.html
Copyright © 2020-2023  润新知