How can I upload using pft's qftp? I already have an ftp client program that downloads. Below is my ftp client code.
#!/usr/bin/env python
# -*- coding: latin-1 -*-
import os, sys
import sip
sip.setapi('QString', 2)
from PySide import QtCore, QtGui, QtNetwork
import ftp_rc
__version__ = '0.1'
class FtpWindow(QtGui.QDialog):
def __init__(self, parent=None):
super(FtpWindow, self).__init__(parent)
self.isDirectory = {}
self.currentPath = ''
self.ftp = None
self.outFile = None
self.outUpFile = None
ftpLoginLabel = QtGui.QLabel('&Usuário:')
ftpPasswdLabel = QtGui.QLabel('&Senha:')
ftpServerLabel = QtGui.QLabel("&Ftp server:")
self.ftpLoginLineEdit = QtGui.QLineEdit('usuario')
self.ftpLoginLineEdit.selectAll()
self.ftpPasswdLineEdit = QtGui.QLineEdit('******')
self.ftpPasswdLineEdit.selectAll()
self.ftpPasswdLineEdit.setEchoMode(QtGui.QLineEdit.Password)
self.ftpServerLineEdit = QtGui.QLineEdit('ftp.trolltech.com')
ftpLoginLabel.setBuddy(self.ftpLoginLineEdit)
ftpServerLabel.setBuddy(self.ftpServerLineEdit)
ftpPasswdLabel.setBuddy(self.ftpPasswdLineEdit)
self.statusLabel = QtGui.QLabel("Por favor entre com o USUÀRIO e SENHA e o SERVIDOR FTP")
self.fileList = QtGui.QTreeWidget()
self.fileList.setEnabled(False)
self.fileList.setRootIsDecorated(False)
self.fileList.setHeaderLabels(("Nome", "Tamanho", "Propriétario", "Grupo", "Ultima Modificação"))
self.fileList.header().setStretchLastSection(False)
self.connectButton = QtGui.QPushButton("Connect")
self.connectButton.setDefault(True)
self.cdToParentButton = QtGui.QPushButton()
self.cdToParentButton.setIcon(QtGui.QIcon(':/images/cdtoparent.png'))
self.cdToParentButton.setEnabled(False)
self.mkdirToParentButton = QtGui.QPushButton()
self.mkdirToParentButton.setIcon(QtGui.QIcon(':/images/newFolder.png'))
self.mkdirToParentButton.setEnabled(False)
self.uploadButton = QtGui.QPushButton('Upload')
self.uploadButton.setEnabled(False)
self.downloadButton = QtGui.QPushButton("Download")
self.downloadButton.setEnabled(False)
self.quitButton = QtGui.QPushButton("Quit")
buttonBox = QtGui.QDialogButtonBox()
buttonBox.addButton(self.uploadButton,
QtGui.QDialogButtonBox.ActionRole)
buttonBox.addButton(self.downloadButton,
QtGui.QDialogButtonBox.ActionRole)
buttonBox.addButton(self.quitButton, QtGui.QDialogButtonBox.RejectRole)
self.progressDialog = QtGui.QProgressDialog(self)
self.fileList.itemActivated.connect(self.processItem)
self.fileList.currentItemChanged.connect(self.enableDownloadButton)
self.progressDialog.canceled.connect(self.cancelDownload)
self.connectButton.clicked.connect(self.connectOrDisconnect)
self.cdToParentButton.clicked.connect(self.cdToParent)
self.mkdirToParentButton.clicked.connect(self.mkdirToParent)
self.uploadButton.clicked.connect(self.uploadFile)
self.downloadButton.clicked.connect(self.downloadFile)
self.quitButton.clicked.connect(self.close)
topLayout = QtGui.QHBoxLayout()
topLayout.addWidget(ftpLoginLabel)
topLayout.addWidget(self.ftpLoginLineEdit)
topLayout.addWidget(ftpPasswdLabel)
topLayout.addWidget(self.ftpPasswdLineEdit)
topLayout.addWidget(ftpServerLabel)
topLayout.addWidget(self.ftpServerLineEdit)
topLayout.addWidget(self.cdToParentButton)
topLayout.addWidget(self.mkdirToParentButton)
topLayout.addWidget(self.connectButton)
mainLayout = QtGui.QVBoxLayout()
mainLayout.addLayout(topLayout)
mainLayout.addWidget(self.fileList)
mainLayout.addWidget(self.statusLabel)
mainLayout.addWidget(buttonBox)
self.setLayout(mainLayout)
self.setWindowTitle("CLIENTE FTP")
self.setWindowIcon(QtGui.QIcon(':/images/janela.png'))
def sizeHint(self):
return QtCore.QSize(800, 600)
def connectOrDisconnect(self):
if self.ftp:
self.ftp.abort()
self.ftp.deleteLater()
self.ftp = None
self.fileList.setEnabled(False)
self.cdToParentButton.setEnabled(False)
self.downloadButton.setEnabled(False)
self.uploadButton.setEnabled(False)
self.connectButton.setEnabled(True)
self.connectButton.setText("Connect")
self.setCursor(QtCore.Qt.ArrowCursor)
return
self.setCursor(QtCore.Qt.WaitCursor)
self.ftp = QtNetwork.QFtp(self)
self.ftp.commandFinished.connect(self.ftpCommandFinished)
self.ftp.listInfo.connect(self.addToList)
self.ftp.dataTransferProgress.connect(self.updateDataTransferProgress)
self.fileList.clear()
self.currentPath = ''
self.isDirectory.clear()
url = QtCore.QUrl(self.ftpServerLineEdit.text())
if not url.isValid() or url.scheme().lower() != 'ftp':
self.ftp.connectToHost(self.ftpServerLineEdit.text(), 21)
self.ftp.login(user=self.ftpLoginLineEdit.text(), password=self.ftpPasswdLineEdit.text())
else:
self.ftp.connectToHost(url.host(), url.port(21))
user_name = url.userName()
if user_name:
try:
# Python v3.
user_name = bytes(user_name, encoding='latin1')
except:
# Python v2.
pass
self.ftp.login(QtCore.QUrl.fromPercentEncoding(user_name), url.password())
else:
self.ftp.login()
if url.path():
self.ftp.cd(url.path())
self.fileList.setEnabled(True)
self.uploadButton.setEnabled(True)
self.mkdirToParentButton.setEnabled(True)
self.connectButton.setEnabled(False)
self.connectButton.setText("Disconnect")
self.statusLabel.setText("Conectando ao serveidor FTP %s..." % self.ftpServerLineEdit.text())
def uploadFile(self):
filename = QtGui.QFileDialog.getOpenFileName(self, 'Upload File', '.')
data = QtCore.QFile(filename[0])
#QtCore.QFile(QtCore.QIODevice.openMode(1))
data.open(QtCore.QFile.ReadOnly)
#qdata = QtCore.QBitArray()
qdata = QtCore.QByteArray(data.readAll())
file = os.path.basename(filename[0])
print data
if not self.fileList.currentItem():
self.ftp.put(qdata, file, self.ftp.TransferType())
elif "." in self.fileList.currentItem().text(0):
self.ftp.put(qdata, self.fileList.currentItem().parent().text(0) + file)
elif self.fileList.currentItem().text(0) == "/":
self.ftp.put(qdata, file)
self.progressDialog.setLabelText("uploading %s..." % fileName)
#self.downloadButton.setEnabled(False)
self.progressDialog.exec_()
else:
print "erro"
def downloadFile(self):
fileName = self.fileList.currentItem().text(0)
fn = QtGui.QFileDialog.getSaveFileName(self, "Salvar como...", None,
"Todos os arquivos (*.*)")
if not fn:
return False
if QtCore.QFile.exists(fn):
QtGui.QMessageBox.information(self, "CLIENTE FTP",
"Ja existe uma arquivo chamado %s no diretorio "
"corrente." % fileName)
return
self.outFile = QtCore.QFile(fn)
if not self.outFile.open(QtCore.QIODevice.WriteOnly):
QtGui.QMessageBox.information(self, "CLIENTE FTP",
"Unable to save the file %s: %s." % (fileName, self.outFile.errorString()))
self.outFile = None
return
self.ftp.get(self.fileList.currentItem().text(0), self.outFile)
self.progressDialog.setLabelText("Downloading %s..." % fileName)
self.downloadButton.setEnabled(False)
self.progressDialog.exec_()
def cancelDownload(self):
self.ftp.abort()
def ftpCommandFinished(self, _, error):
self.setCursor(QtCore.Qt.ArrowCursor)
if self.ftp.currentCommand() == QtNetwork.QFtp.ConnectToHost:
if error:
QtGui.QMessageBox.information(self, "CLIENTE FTP",
"Nao foi possivel se conectar ao servidor ftp %s. Por favor "
"verifique se o nome do host esta correto." % self.ftpServerLineEdit.text())
self.connectOrDisconnect()
return
self.statusLabel.setText("Conectado como %s em %s." % (self.ftpLoginLineEdit.text(),self.ftpServerLineEdit.text()))
self.fileList.setFocus()
self.downloadButton.setDefault(True)
self.connectButton.setEnabled(True)
return
if self.ftp.currentCommand() == QtNetwork.QFtp.Login:
self.ftp.list()
if self.ftp.currentCommand() == QtNetwork.QFtp.Put:
if error:
self.statusLabel.setText('upload cancelado do %s.' % self)
if self.ftp.currentCommand() == QtNetwork.QFtp.Get:
if error:
self.statusLabel.setText("download cancelado do %s." % self.outFile.fileName())
self.outFile.close()
self.outFile.remove()
else:
self.statusLabel.setText("Downloaded %s para o diretorio." % self.outFile.fileName())
self.outFile.close()
self.outFile = None
self.enableDownloadButton()
self.progressDialog.hide()
elif self.ftp.currentCommand() == QtNetwork.QFtp.List:
if not self.isDirectory:
self.fileList.addTopLevelItem(QtGui.QTreeWidgetItem(["<empty>"]))
self.fileList.setEnabled(False)
def addToList(self, urlInfo):
item = QtGui.QTreeWidgetItem()
item.setText(0, urlInfo.name())
item.setText(1, str(urlInfo.size()))
item.setText(2, urlInfo.owner())
item.setText(3, urlInfo.group())
item.setText(4, urlInfo.lastModified().toString('dd MMM yyyy HH:MM'))
if urlInfo.isDir():
icon = QtGui.QIcon(':/images/dir.png')
else:
icon = QtGui.QIcon(':/images/file.png')
item.setIcon(0, icon)
self.isDirectory[urlInfo.name()] = urlInfo.isDir()
self.fileList.addTopLevelItem(item)
if not self.fileList.currentItem():
self.fileList.setCurrentItem(self.fileList.topLevelItem(0))
self.fileList.setEnabled(True)
def processItem(self, item):
name = item.text(0)
if self.isDirectory.get(name):
self.fileList.clear()
self.isDirectory.clear()
self.currentPath += '/' + name
self.ftp.cd(name)
self.ftp.list()
self.cdToParentButton.setEnabled(True)
self.setCursor(QtCore.Qt.WaitCursor)
def cdToParent(self):
self.setCursor(QtCore.Qt.WaitCursor)
self.fileList.clear()
self.isDirectory.clear()
dirs = self.currentPath.split('/')
if len(dirs) > 1:
self.currentPath = ''
#self.cdToParentButton.setEnabled(False)
self.ftp.cd('..')
else:
self.currentPath = '/'.join(dirs[:-1])
self.ftp.cd(self.currentPath)
self.ftp.list()
def mkdirToParent(self):
foldername = unicode(self.commandEdit.text())
def updateDataTransferProgress(self, readBytes, totalBytes):
self.progressDialog.setMaximum(totalBytes)
self.progressDialog.setValue(readBytes)
def enableDownloadButton(self):
current = self.fileList.currentItem()
if current:
currentFile = current.text(0)
self.downloadButton.setEnabled(not self.isDirectory.get(currentFile))
else:
self.downloadButton.setEnabled(False)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
ftpWin = FtpWindow()
ftpWin.show()
sys.exit(ftpWin.exec_())
In the above code there is an attempt by me to upload but I did not succeed.