예제 #1
0
class DownloadFtp(Download):
    progressModified = pyqtSignal(object)
    stateChanged = pyqtSignal(object)
    downloadFinished = pyqtSignal(object)
    speedModified = pyqtSignal(object)

    def __init__(self, file_share, local_path, date, state):
        Download.__init__(self, file_share, local_path, date, state)
        self.ftp = QFtp(self)
        # Signaux
        self.ftp.dataTransferProgress.connect(self.update_progress)
        self.ftp.done.connect(self.download_finished)
        self.ftp.stateChanged.connect(self.state_changed)
        # Ouverture de fichiers
        self.url = QUrl(self._file_share.url)
        self.out_file = QFile(self.local_path)
        # Vars
        self.read_bytes = self.out_file.size()
        # Timer
        self.timer = QTimer()
        self.timer.start(500)
        self.timer.timeout.connect(self.update_speed)

    def start_download(self):
        self.ftp.connectToHost(self.url.host(), self.url.port(21))
        self.ftp.login()
        if self.out_file.open(QIODevice.WriteOnly):
            self.ftp.get(self.url.path(), self.out_file)

    def stop(self):
        self._state = 5
        self.ftp.abort()
        self.timer.stop()
        self.ftp.close()

    def state_changed(self, state):
        if state == 1 or state == 2:
            self._state = 1
        elif state == 3 or state == 4:
            self._state = 3
        self.stateChanged.emit(self)

    def download_finished(self, _):
        print "finished !"
        if self.read_bytes != self.file_share.size:
            self._state = 7
        self._speed = 0
        self.timer.stop()
        self.ftp.abort()
        self.ftp.close()
        self._state = 4
        self.stateChanged.emit(self)
        self.ftp.done.disconnect(self.download_finished)
        self.ftp.stateChanged.disconnect(self.state_changed)
        self.ftp.dataTransferProgress.disconnect(self.update_progress)
        self.downloadFinished.emit(self)

    def update_speed(self):
        delta = time.time() - self._last_time
        self._speed = float(self.read_bytes - self._last_size) / delta
        self.last_time = time.time()
        self.last_size = self.read_bytes
        self.speedModified.emit(self)

    def update_progress(self, read_bytes, total_bytes):
        self.read_bytes = read_bytes
        self.progressModified.emit(self)
예제 #2
0
class UploadThread(QThread):
    information = pyqtSignal(str)

    def __init__(self):
        super(UploadThread, self).__init__()
        self.ftp = QFtp(self)
        self.ftp.stateChanged.connect(self.on_ftp_stateChanged)
        self.ftp.commandFinished.connect(self.on_ftp_commandFinished)
        self.ftp.dataTransferProgress.connect(self.on_ftp_dataTransferProgress)
        self.uploading = False

    def setData(self, files, servers):
        self.files = files
        self.servers = servers
        self.servers_index = 0
        self.succeed = 0

    def run(self):
        num = len(self.servers)
        for self.servers_index in range(num):
            self.files_index = 0
            self.ftp.connectToHost(
                self.servers[self.servers_index]["host"],
                int(self.servers[self.servers_index]["port"]))
            self.uploading = True
            while self.uploading:
                QThread.sleep(1)

        self.information.emit(
            u"<font color=green>所有服务器上传完成。成功:%s 失败:%s</font><br />" %
            (self.succeed, num - self.succeed))

    def terminate(self):
        self.ftp.abort()
        super(UploadThread, self).terminate()
        self.information.emit(u"<font color=red>上传任务被终止!</font><br />")

    def on_ftp_stateChanged(self, state):
        if self.ftp.error():
            self.information.emit(u"<font color=red>错误:%s</font>" %
                                  self.ftp.errorString())
            if self.ftp.error() == 1:
                self.ftp.close()
            else:
                self.do_ftp_close()

        if state == QFtp.HostLookup:
            s = Template(
                u"""创建连接:${platform}-${server_name} 主机:${host} 端口:${port}""")
            self.information.emit(
                s.substitute(self.servers[self.servers_index]))
        elif state == QFtp.Connecting:
            pass
        elif state == QFtp.Connected:
            self.information.emit(u"登陆账号:%s" %
                                  self.servers[self.servers_index]["account"])
            self.do_ftp_login()
        elif state == QFtp.LoggedIn:
            self.information.emit(u"进入目录:%s" %
                                  self.servers[self.servers_index]["path"])
            self.do_ftp_cd()
        elif state == QFtp.Closing:
            self.do_ftp_close()

    def on_ftp_commandFinished(self):
        if self.ftp.error():
            self.information.emit(u"<font color=red>错误:%s</font>" %
                                  self.ftp.errorString())
            if self.ftp.error() == 1:
                self.ftp.close()
            else:
                self.do_ftp_close()

        if self.ftp.currentCommand() == QFtp.Login:
            pass
        elif self.ftp.currentCommand() == QFtp.Cd:
            self.do_ftp_put()
        elif self.ftp.currentCommand() == QFtp.Put:
            self.information.emit(u"上传成功:%s" % self.files[self.files_index])

            self.files_index += 1
            if self.files_index == len(self.files):
                self.information.emit(u"上传完成")
                self.succeed += 1

    def do_ftp_login(self):
        self.ftp.login(self.servers[self.servers_index]["account"],
                       self.servers[self.servers_index]["password"])

    def do_ftp_cd(self):
        self.ftp.cd(self.servers[self.servers_index]["path"])

    def do_ftp_put(self):
        num = len(self.files)
        for i in range(num):
            file = self.files[i]
            fhandle = QFile(file)
            fhandle.open(QIODevice.ReadOnly)
            byte_array = QByteArray()
            byte_array.append(fhandle.readData(fhandle.size()))

            fileinfo = QFileInfo(file)
            filename = fileinfo.fileName()
            self.ftp.put(byte_array, filename)

        self.ftp.close()

    def on_ftp_dataTransferProgress(self, done, total):
        pass

    def do_ftp_close(self):
        self.ftp.abort()
        self.information.emit(u"断开连接<br />")
        self.uploading = False
예제 #3
0
파일: uploadthread.py 프로젝트: BlueAaron/-
class UploadThread(QThread):
    information = pyqtSignal(str)
    
    def __init__(self):
        super(UploadThread,self).__init__()
        self.ftp = QFtp(self)   
        self.ftp.stateChanged.connect(self.on_ftp_stateChanged)
        self.ftp.commandFinished.connect(self.on_ftp_commandFinished)
        self.ftp.dataTransferProgress.connect(self.on_ftp_dataTransferProgress)
        self.uploading = False    
        
    def setData(self, files, servers):
        self.files = files
        self.servers = servers
        self.servers_index = 0
        self.succeed = 0
        
    def run(self):
        num = len(self.servers)
        for self.servers_index in range(num):        
            self.files_index = 0
            self.ftp.connectToHost(self.servers[self.servers_index]["host"], int(self.servers[self.servers_index]["port"]))
            self.uploading = True
            while self.uploading:
                QThread.sleep(1)
        
        self.information.emit(u"<font color=green>所有服务器上传完成。成功:%s 失败:%s</font><br />" % (self.succeed, num - self.succeed))
    
    def terminate(self):
        self.ftp.abort()
        super(UploadThread, self).terminate()
        self.information.emit(u"<font color=red>上传任务被终止!</font><br />")
        
    def on_ftp_stateChanged(self, state):
        if self.ftp.error():
            self.information.emit(u"<font color=red>错误:%s</font>" % self.ftp.errorString())
            if self.ftp.error() == 1:
                self.ftp.close()
            else:
                self.do_ftp_close()
        
        if state == QFtp.HostLookup:
            s = Template(
            u"""创建连接:${platform}-${server_name} 主机:${host} 端口:${port}"""
            )
            self.information.emit(s.substitute(self.servers[self.servers_index]))    
        elif state == QFtp.Connecting:
            pass
        elif state == QFtp.Connected:
            self.information.emit(u"登陆账号:%s" % self.servers[self.servers_index]["account"])
            self.do_ftp_login()
        elif state == QFtp.LoggedIn:
            self.information.emit(u"进入目录:%s" % self.servers[self.servers_index]["path"])
            self.do_ftp_cd()
        elif state == QFtp.Closing:                      
            self.do_ftp_close()
        
    def on_ftp_commandFinished(self):     
        if self.ftp.error():
            self.information.emit(u"<font color=red>错误:%s</font>" % self.ftp.errorString())
            if self.ftp.error() == 1:
                self.ftp.close()
            else:
                self.do_ftp_close()
            
        if self.ftp.currentCommand() == QFtp.Login:
            pass
        elif self.ftp.currentCommand() == QFtp.Cd:            
            self.do_ftp_put()          
        elif self.ftp.currentCommand() == QFtp.Put:            
            self.information.emit(u"上传成功:%s" % self.files[self.files_index])
            
            self.files_index += 1
            if self.files_index == len(self.files):
                self.information.emit(u"上传完成")                
                self.succeed += 1
    
    def do_ftp_login(self):
        self.ftp.login(self.servers[self.servers_index]["account"], self.servers[self.servers_index]["password"])
        
    def do_ftp_cd(self):
        self.ftp.cd(self.servers[self.servers_index]["path"])
        
    def do_ftp_put(self):
        num = len(self.files)
        for i in range(num):
            file = self.files[i]
            fhandle = QFile(file)
            fhandle.open(QIODevice.ReadOnly)
            byte_array = QByteArray()
            byte_array.append(fhandle.readData(fhandle.size()))
            
            fileinfo = QFileInfo(file)
            filename = fileinfo.fileName()
            self.ftp.put(byte_array, filename)  
                   
        self.ftp.close()
        
    def on_ftp_dataTransferProgress(self, done,total):
        pass
        
    def do_ftp_close(self):
        self.ftp.abort()
        self.information.emit(u"断开连接<br />")
        self.uploading = False