示例#1
0
 def put(self, command_str):
     """
     向服务器上传文件
     :param command_str: put   上传文件名
     :return:
     """
     command_list = command_str.split()
     file = command_list[1]
     file_size = os.stat(file).st_size
     file_md5 = md5(str(file_size))
     file_name = os.path.basename(file)
     #将命令汇总成字典,方便传输
     command_dict = {
         "command": "put",
         "file_name": file_name,
         "file_size": file_size,
         "file_md5": file_md5,
     }
     #路径是可选参数
     if len(command_list) == 3:
         file_path = command_list[2]
         command_dict["file_path"] = file_path
     command_msg = json.dumps(command_dict)
     self.socket.sendall(bytes(command_msg, encoding='utf-8'))
     feedback = str(self.socket.recv(1024), encoding='utf-8')
     if feedback == '开始传输文件!':
         print(feedback + '1\n')
         try:
             with open(file, 'rb') as f:
                 send_size = 0
                 for line in f:
                     self.socket.sendall(line)
                     send_size += len(line)
                     #进度格显示,稍后做
                     #self.ProgressBat.update(send_size,file_size)
         except:
             print("传输中断!")
     elif feedback == '继续传输文件':
         print(feedback + '2\n')
         continue_length = int(str(self.socket.recv(1024),
                                   encoding='utf-8'))
         try:
             with open(file, 'rb') as f:
                 f.seek(continue_length)
                 send_size = continue_length
                 for line in f:
                     self.socket.sendall(line)
                     send_size += len(line)
                     # 进度格显示,稍后做
                     # self.ProgressBat.update(send_size,file)
         except:
             print('传输中断')
     else:
         print(feedback)
         return
     #接收put操作的结果
     result = str(self.socket.recv(1024), encoding='utf-8')
     print(result + '3')
示例#2
0
 def __init__(self):
     self.config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),'etc','config.ini')
     self.CONFIG = Config('E:\python_code\FTP\FTP_SERVER\etc\config.ini','SERVER')
     self.data = self.CONFIG.data_path
     self.user_db = os.path.join(self.CONFIG.db_path,'user.json')
     self.user_path = None
     self.dir_size = int(self.CONFIG.dir_size)*1024*1024
     if not os.path.exists(self.user_db):
         user_dict = {
             'admin':{
                 'password':md5('admin'),
                 'dir_size':self.dir_size,
                 'super_user':'******',
                 'lock_status':'0',
                 'user_dir':os.path.join(self.data,'admin')
             }
         }
         json.dumps(user_dict,open(self.user_db,'w'))
         user_home = os.path.join(self.data,'admin')
         os.mkdir(user_home)
示例#3
0
 def login(self):
     print("连接至", self.host)
     user_name = input("账号名:")
     #password = getpass.getpass("密码:")
     password = input("密码:")
     login_dict = {
         'command': 'login',
         'user_name': user_name,
         'password': md5(password)
     }
     self.user_name = user_name
     login_info = json.dumps(login_dict)
     self.socket.connect((self.host, self.port))
     self.socket.sendall(bytes(login_info, encoding='utf-8'))
     login_status = str(self.socket.recv(1024), encoding='utf-8')
     print(login_status)
     if login_status == '登录成功':
         return True
     else:
         return False
示例#4
0
    def get(self, command_dict):
        """
        下载文件
        :param command_dict:
        :return:
        """
        file_name = command_dict['file_name']
        file_path = self._new_path(file_name)
        if not os.path.exists(file_path):
            self.request.sendall(bytes('文件不存在', encoding='utf-8'))
            return False
        file_size = os.stat(file_path).st_size
        file_md5 = md5(str(file_size))
        file_name = os.path.basename(file_path)
        file_status = {
            'file_name': file_name,
            'file_size': file_size,
            'file_md5': file_md5,
        }

        file_status = json.dumps(file_status)
        self.request.sendall(bytes(file_status, encoding='utf-8'))
        recv_status = str(self.request.recv(1024), encoding='utf-8')
        if recv_status == '从头获取文件':
            try:
                with open(file_path, 'rb') as file:
                    for line in file:
                        self.request.sendall(line)
            except:
                print('传输文件中断')
        elif recv_status == '续传文件':
            continue_length = int(
                str(self.request.recv(1024), encoding='utf-8'))
            try:
                with open(file_path, 'rb') as file:
                    file.seek(continue_length)
                    for line in file:
                        self.request.sendall(line)
            except:
                print('文件传输中断')
示例#5
0
    def put(self, command_dict):
        """
        上传文件服务器端操作
        :param command_dict:
        :return:
        """
        #   print(command_dict)
        file_name = command_dict['file_name']
        file_size = command_dict['file_size']
        file_md5 = command_dict['file_md5']
        user_size = self.user_json[self.user_name]['dir_size']
        user_du = self._get_size(self.user_path)
        user_size -= user_du
        #判断文件大小是否满足用户空间的限制
        if file_size > user_size:
            self.request.sendall(bytes("文件大小超过用户空间限制", encoding='utf-8'))
            return False
        #判断用户是否传入文件路径
        if command_dict.get('file_path'):
            path = command_dict['file_path']
            file_path = os.path.join(self._new_path(path), file_name)
        else:
            file_path = os.path.join(self.current_path, file_name)
        #判断文件是否存在,存在的话检测是否上传完毕,未完毕的话断点续传
        if os.path.exists(file_path):

            des_md5 = md5(str(os.stat(file_path).st_size))
            if des_md5 == file_md5:
                self.request.sendall(bytes("文件已存在", encoding='utf-8'))
                return False
            #文件存在,但不完整,断点续传
            self.request.sendall(bytes('继续传输文件', encoding='utf-8'))
            continue_length = os.stat(file_path).st_size
            send_length = str(os.stat(file_path).st_size)
            self.request.sendall(bytes(send_length, encoding='utf-8'))
            #接受bytes字节数据,追加写
            try:
                with open(file_path, 'ab') as file:
                    while continue_length < file_size:
                        recv_data = self.request.recv(1024)
                        file.write(recv_data)
                        continue_length += len(recv_data)
            except:
                print("文件传输中断")
        #文件不存在,从头开始传输
        else:
            print("开始传输文件")
            self.request.sendall(bytes('开始传输文件!', encoding='utf-8'))
            recv_size = 0
            try:
                with open(file_path, 'wb') as file:
                    while recv_size < file_size:
                        recv_data = self.request.recv(1024)
                        file.write(recv_data)
                        recv_size += len(recv_data)
            except:
                print("文件传输中断")
        #最后校验文件
        des_md5 = md5(str(os.stat(file_path).st_size))
        if des_md5 == file_md5:
            self.request.sendall(bytes("文件传输完毕", encoding='utf-8'))
        else:
            self.request.sendall(bytes("传输过程中出现问题", encoding='utf-8'))
示例#6
0
 def get(self, command_str):
     """
     下载文件
     :param command_str:
     :return:
     """
     command_list = command_str.split()
     file_name = command_list[1]
     des_path = os.path.abspath(os.path.curdir)
     if len(command_list) == 3:
         des_path = command_list[2]
         if not os.path.isdir(des_path):
             print('%s不是合法路径' % des_path)
             return False
     command_dict = {
         "command": "get",
         "file_name": file_name,
     }
     command_msg = json.dumps(command_dict)
     self.socket.sendall(bytes(command_msg, encoding='utf-8'))
     file_status = str(self.socket.recv(1024), encoding='utf-8')
     if file_status.startswith('Error'):
         print(file_status)
         return False
     file_status = json.loads(file_status)
     file_name = file_status['file_name']
     file_size = file_status['file_size']
     file_md5 = file_status['file_md5']
     file_path = os.path.join(des_path, file_name)
     if os.path.exists(file_path):
         if md5(os.stat(file_path).st_size) == file_md5:
             print("目标文件已存在")
             return False
         print("续传文件:")
         self.socket.sendall(bytes('续传文件', encoding='utf-8'))
         recv_size = os.stat(file_path).st_size
         continue_length = str(recv_size)
         self.socket.sendall(bytes(continue_length, encoding='utf-8'))
         try:
             with open(file_path, 'ab') as file:
                 while recv_size < file_size:
                     recv_data = self.socket.recv(1024)
                     file.write(recv_data)
                     recv_size += len(recv_data)
                     #更新进度条
             return True
         except Exception as error:
             print('获取文件途中出错:%s' % error)
     else:
         self.socket.sendall(bytes("从头获取文件", encoding='utf-8'))
         recv_size = 0
         try:
             with open(file_path, 'wb') as file:
                 while recv_size < file_size:
                     recv_data = self.socket.recv(1024)
                     file.write(recv_data)
                     recv_size += len(recv_data)
                     #更新进度条
             return True
         except Exception as error:
             print('获取文件途中出错:%s' % error)
     if md5(str(os.stat(file_path).st_size)) == file_md5:
         print('文件传输完成')
         return True