# -*- coding: utf-8 -*-
#另外友情说明一下,如果要测试,可以用webpy框架搭建一个服务器。
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
from PyQt4.QtNetwork import *
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
class FtpClient(QDialog):
def __init__(self,parent=None):
super(FtpClient,self).__init__(parent)
self.setWindowTitle(self.tr("实现Ftp上传和下载"))
vbMain = QVBoxLayout(self)
hb1 = QHBoxLayout()
LabelServer = QLabel(self)
LabelServer.setText(self.tr("服务器地址:"))
self.LineEditServer = QLineEdit(self)
hb1.addWidget(LabelServer)
hb1.addWidget(self.LineEditServer)
hb2 = QHBoxLayout()
UserName = QLabel(self)
UserName.setText(self.tr("用户名:"))
self.LineEditUser = QLineEdit(self)
hb2.addWidget(UserName)
hb2.addWidget(self.LineEditUser)
hb3 = QHBoxLayout()
PasswordName = QLabel(self)
PasswordName.setText(self.tr("密码:"))
self.LineEditPassword = QLineEdit(self)
hb3.addWidget(PasswordName)
hb3.addWidget(self.LineEditPassword)
hb4 = QHBoxLayout()
self.PushButtonLogin = QPushButton(self)
self.PushButtonLogin.setText(self.tr("登录"))
hb4.addWidget(self.PushButtonLogin)
hb5 = QHBoxLayout()
self.PushButtonPut = QPushButton(self)
self.PushButtonPut.setText(self.tr("上传"))
self.PushButtonGet = QPushButton(self)
self.PushButtonGet.setText(self.tr("下载"))
hb5.addWidget(self.PushButtonPut)
hb5.addWidget(self.PushButtonGet)
vbMain.addLayout(hb1)
vbMain.addLayout(hb2)
vbMain.addLayout(hb3)
vbMain.addLayout(hb4)
vbMain.addLayout(hb5)
self.connect(self.PushButtonLogin,SIGNAL("clicked()"),self.slotLogin)
self.connect(self.PushButtonPut,SIGNAL("clicked()"),self.slotPut)
self.connect(self.PushButtonGet,SIGNAL("clicked()"),self.slotGet)
self.curStatus = ""
self.localFile = QFile()
self.remoteFileName = QFile()
self.PushButtonPut.setEnabled(False)
self.PushButtonGet.setEnabled(False)
def slotLogin(self):
serverAddress = self.LineEditServer.text()
if serverAddress.isEmpty():
QMessageBox.warning(self,self.tr("error"),self.tr("Please input server address!"))
return
userName = self.LineEditUser.text()
if userName.isEmpty():
QMessageBox.warning(self,self.tr("error"),self.tr("Please input user name!"))
return
password = self.LineEditPassword.text()
if password.isEmpty():
QMessageBox.warning(self,self.tr("error"),self.tr("Please input Passwrod!"))
return
self.ftpClient = QFtp()
self.ftpClient.connectToHost(serverAddress)
self.connect(self.ftpClient,SIGNAL("stateChanged(int)"),self.slotStateChanged)
self.connect(self.ftpClient,SIGNAL("done(bool)"),self.slotDone)
self.ftpClient.login(userName,password)
self.curStatus = "LOGIN"
def slotStateChanged(self,state):
if state == QFtp.LoggedIn:
self.PushButtonPut.setEnabled(True)
self.PushButtonGet.setEnabled(True)
def slotPut(self):
OK = False
fileName,OK = QInputDialog.getText(self,self.tr("Put File:"),self.tr("Please input file name:"),QLineEdit.Normal,QString())
if OK and not fileName.isEmpty():
self.remoteFileName = QFile(fileName)
self.ftpClient.put(self.remoteFileName,fileName)
self.curStatus = "PUT"
def slotGet(self):
OK = False
fileName,OK = QInputDialog.getText(self,self.tr("Get File:"),self.tr("Please input file name:"),QLineEdit.Normal,QString())
if OK and not fileName.isEmpty():
self.localFile = QFile(fileName)
self.localFile.open(QIODevice.WriteOnly)
self.ftpClient.get(fileName,self.localFile)
self.curStatus = "GET"
def slotDone(self,error):
if error:
QMessageBox.warning(self,self.tr("error"),self.ftpClient.errorString())
return
if self.curStatus == "LOGIN":
self.PushButtonLogin.setEnabled(False)
self.curStatus = "None"
if self.curStatus == "PUT":
QMessageBox.warning(self,self.tr("succeed"),self.tr("Put file succeed!"))
self.curStatus = "None"
if self.curStatus == "GET":
self.localFile.close()
QMessageBox.warning(self,self.tr("succeed"),self.tr("Get file succeed!"))
self.curStatus = "None"
app=QApplication(sys.argv)
dialog=FtpClient()
dialog.show()
app.exec_()