Esempio n. 1
0
 def get(self, user_input):
     '''
     客户端下载方法
     :param user_input: 用户输入的指令
     :return: 无
     '''
     import os
     if len(user_input) == 2:  # 如果是get xxx,则表示下载到当前目录
         dst_path = '.'
     elif len(user_input) == 3:  # 如果是 get xxx xxx,则表示要下载到其他目录
         dst_path = user_input[2]
     else:
         print(self.__code_list['401'])
         return None
     if os.path.isdir(dst_path):  # 判断目标文件是否存在
         filename = user_input[1]  # 获取下载的文件名
         tmp_filename = os.path.join(self.__tmp_path, '%s.ftp' %
                                     os.path.split(filename)[1])  # 定义临时文件
         if os.path.isfile(tmp_filename):  # 判断临时文件是否存在(也就是是否需要续传)
             tmp_file_size = os.path.getsize(tmp_filename)  # 获取临时文件的大小
         else:
             tmp_file_size = 0
         self.__sk.send(
             mylib.s2b(r'get|{"filename":"%s", "sendsize": %s}' %
                       (filename, tmp_file_size)))  # 向服务端发送下载指令接文件名和已近下载的大小
         Confirm = mylib.b2s(self.__sk.recv(100)).split('|')  # 获取服务器反馈
         if Confirm[0] == 'ready':  # 如果是ready则准备下载文件
             file_size = json.loads(Confirm[1])['filesize']  # 获取文件大小
             md5 = json.loads(Confirm[1])['md5']  # 获取md5
             recv_size = tmp_file_size
             f = open(tmp_filename, 'ab')
             while file_size != recv_size:
                 # 只要已下载大小不等于文件大小则循环接受数据
                 try:
                     data = self.__sk.recv(conf.FILE_PER_SIZE)
                     recv_size += len(data)
                     f.write(data)
                     mylib.process_bar(recv_size, file_size)
                 except socket.error as e:
                     print(self.__code_list['306'])
                     f.close()
                     break
                 except IOError as e:
                     print(self.__code_list['305'])
             f.close()
             print('')
             print('Validating...')
             new_md5 = mylib.get_file_md5(tmp_filename)
             if new_md5 == md5:  # 验证md5,如果验证通过修改成正式文件名,如果没验证过去删除临时文件
                 import shutil
                 shutil.move(tmp_filename, os.path.join(dst_path, filename))
             else:
                 os.remove(tmp_filename)
         else:
             print(self.__code_list[Confirm[1]])
     else:
         print(self.__code_list['304'])
Esempio n. 2
0
 def get(self, user_input):
     '''
     客户端下载方法
     :param user_input: 用户输入的指令
     :return: 无
     '''
     import os
     if len(user_input) == 2: # 如果是get xxx,则表示下载到当前目录
         dst_path = '.'
     elif len(user_input) == 3: # 如果是 get xxx xxx,则表示要下载到其他目录
         dst_path = user_input[2]
     else:
         print(self.__code_list['401'])
         return None
     if os.path.isdir(dst_path): # 判断目标文件是否存在
         filename = user_input[1] # 获取下载的文件名
         tmp_filename = os.path.join(self.__tmp_path,'%s.ftp' %os.path.split(filename)[1]) # 定义临时文件
         if os.path.isfile(tmp_filename): # 判断临时文件是否存在(也就是是否需要续传)
             tmp_file_size = os.path.getsize(tmp_filename) # 获取临时文件的大小
         else:
             tmp_file_size = 0
         self.__sk.send(mylib.s2b(r'get|{"filename":"%s", "sendsize": %s}' %(filename, tmp_file_size))) # 向服务端发送下载指令接文件名和已近下载的大小
         Confirm = mylib.b2s(self.__sk.recv(100)).split('|') # 获取服务器反馈
         if Confirm[0] == 'ready': # 如果是ready则准备下载文件
             file_size = json.loads(Confirm[1])['filesize'] # 获取文件大小
             md5 = json.loads(Confirm[1])['md5'] # 获取md5
             recv_size = tmp_file_size
             f = open(tmp_filename, 'ab')
             while file_size != recv_size:
                 # 只要已下载大小不等于文件大小则循环接受数据
                 try:
                     data = self.__sk.recv(conf.FILE_PER_SIZE)
                     recv_size += len(data)
                     f.write(data)
                     mylib.process_bar(recv_size, file_size)
                 except socket.error as e:
                     print(self.__code_list['306'])
                     f.close()
                     break
                 except IOError as e:
                     print(self.__code_list['305'])
             f.close()
             print('')
             print('Validating...')
             new_md5 = mylib.get_file_md5(tmp_filename)
             if new_md5 == md5: # 验证md5,如果验证通过修改成正式文件名,如果没验证过去删除临时文件
                 import shutil
                 shutil.move(tmp_filename, os.path.join(dst_path, filename))
             else:
                 os.remove(tmp_filename)
         else:
             print(self.__code_list[Confirm[1]])
     else:
         print(self.__code_list['304'])
Esempio n. 3
0
    def put(self, instructions):
        '''
        put方法
        :param instructions: 客户端指令
        :return: 无
        '''
        import os
        import json

        res = json.loads(instructions[1])
        file_name = os.path.join(self.__current_path, res['filename']) # 获取上传的文件名
        md5 = res['md5'] # 获取上传的文件的md5
        tmp_file_name = os.path.join(self.__current_path, '%s.ftp' %res['filename']) # 定义临时文件
        if os.path.isfile(tmp_file_name): # 判断临时文件,如果存在说明没传完,将续传
            tmp_file_size = os.path.getsize(tmp_file_name) # 获取已经上传的大小
        else:
            tmp_file_size = 0
        self.request.send(mylib.s2b(r'ready|{"recv_size":%s}' %tmp_file_size)) # 通知客户端准备上传并返回已近上传的大小
        recv_size = tmp_file_size
        file_size = res['file_size']
        f = open(tmp_file_name, 'ab')
        self.__loger.info('Begin recv file  %s from client [%s]' %(file_name, self.client_address))
        while recv_size != file_size:
            # 只要已上传的大小不等于文件的大小就循环获取数据写入文件
            try:
                data = self.request.recv(conf.FILE_PER_SIZE)
                recv_size += len(data)
                f.write(data)
                mylib.process_bar(recv_size, file_size)
            except socket.error as e:
                print(self.__code_list['306'])
                f.close()
                break
            except IOError as e:
                print(self.__code_list['305'])
                f.close()
                break
        f.close()
        self.__loger.info('End recv file  %s from client [%s]' %(file_name, self.client_address))
        new_md5 = mylib.get_file_md5(tmp_file_name) # 获取上传后的md5值
        self.__loger.info('Begin validate md5 [%s]' %tmp_file_name)
        if new_md5 == md5: # 验证md5,成功则将临时文件名改为正式文件名
            import shutil
            shutil.move(tmp_file_name, file_name)
            self.request.sendall(mylib.s2b('308'))
            self.__loger.info('%s %s' %(self.__code_list['308'], tmp_file_name))
        else:
            os.remove(tmp_file_name)
            self.request.sendall(mylib.s2b('309'))
            self.__loger.info('%s %s' %(self.__code_list['309'], tmp_file_name))
        self.__loger.info('End validate md5 [%s]' %tmp_file_name)
Esempio n. 4
0
 def put(self, user_input):
     '''
     客户端上传方法
     :param user_input: 指令
     :return: 无
     '''
     import json
     if len(user_input) == 2:
         file_name = user_input[1]
         if not os.path.isfile(file_name):
             print(self.__code_list['302'])
             return None
         self.__sk.sendall(mylib.s2b('checkspacesize'))
         res = json.loads(mylib.b2s(self.__sk.recv(100)))
         free_size = int(res['freesize']) * 1024 * 1024  # 获取剩余空间大小
         file_size = os.path.getsize(file_name)
         if free_size > file_size:  # 判断剩余空间是否够,够就下载,不够就直接返回
             md5 = mylib.get_file_md5(file_name)  # 获取上传文件的md5
             self.__sk.send(
                 mylib.s2b(
                     r'put|{"filename":"%s", "file_size":%s, "md5":"%s"}' %
                     (os.path.split(file_name)[1], file_size,
                      md5)))  # 发送上传指令,并通知服务端文件名,文件大小和md5
             res = mylib.b2s(self.__sk.recv(200)).split('|')  # 获取服务端确认信息
             if res[0] == 'ready':
                 send_size = json.loads(res[1])['recv_size']  # 获取已经上传的大小
                 f = open(file_name, 'rb')
                 f.seek(send_size)  # 设定文件的其实位置为已上传的大小
                 while file_size != send_size:
                     # 只要文件大小不等于上传的大小则循环读文件并上传数据
                     if file_size - send_size > conf.FILE_PER_SIZE:
                         data = f.read(conf.FILE_PER_SIZE)
                         send_size += conf.FILE_PER_SIZE
                     else:
                         data = f.read(file_size - send_size)
                         send_size += (file_size - send_size)
                     self.__sk.send(data)
                     mylib.process_bar(send_size, file_size)
                 print(mylib.b2s(self.__sk.recv(200)))
                 print("")
         else:
             print(self.__code_list['307'])
     else:
         print(self.__code_list['401'])
Esempio n. 5
0
 def put(self, user_input):
     '''
     客户端上传方法
     :param user_input: 指令
     :return: 无
     '''
     import json
     if len(user_input) == 2:
         file_name = user_input[1]
         if not os.path.isfile(file_name):
             print(self.__code_list['302'])
             return None
         self.__sk.sendall(mylib.s2b('checkspacesize'))
         res = json.loads(mylib.b2s(self.__sk.recv(100)))
         free_size = int(res['freesize']) * 1024 * 1024 # 获取剩余空间大小
         file_size = os.path.getsize(file_name)
         if free_size > file_size: # 判断剩余空间是否够,够就下载,不够就直接返回
             md5 = mylib.get_file_md5(file_name) # 获取上传文件的md5
             self.__sk.send(mylib.s2b(r'put|{"filename":"%s", "file_size":%s, "md5":"%s"}' %(os.path.split(file_name)[1], file_size, md5))) # 发送上传指令,并通知服务端文件名,文件大小和md5
             res = mylib.b2s(self.__sk.recv(200)).split('|') # 获取服务端确认信息
             if res[0] == 'ready':
                 send_size = json.loads(res[1])['recv_size'] # 获取已经上传的大小
                 f = open(file_name, 'rb')
                 f.seek(send_size) # 设定文件的其实位置为已上传的大小
                 while file_size != send_size:
                     # 只要文件大小不等于上传的大小则循环读文件并上传数据
                     if file_size - send_size > conf.FILE_PER_SIZE:
                         data = f.read(conf.FILE_PER_SIZE)
                         send_size += conf.FILE_PER_SIZE
                     else:
                         data = f.read(file_size - send_size)
                         send_size += (file_size - send_size)
                     self.__sk.send(data)
                     mylib.process_bar(send_size, file_size)
                 print(mylib.b2s(self.__sk.recv(200)))
                 print("")
         else:
             print(self.__code_list['307'])
     else:
         print(self.__code_list['401'])