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')
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)
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
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('文件传输中断')
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'))
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