Qt用FTP进行上传下载

水军总督 2013-04-09 11:03:59
#include "ftpclient.h"
#include "ui_ftpclient.h"
#include <QString>
#include <QMessageBox>
#include <QtGui>

FtpClient::FtpClient(QWidget *parent) :
QDialog(parent),
ui(new Ui::FtpClient)
{
ui->setupUi(this);
LabelServer=new QLabel(tr("服务器:")); //192.168.108.6
LabelUser=new QLabel(tr("用户名:"));
LabelPassword=new QLabel(tr("密码:")); //ft4w685Y
PushButtonLogin=new QPushButton;
PushButtonPut=new QPushButton;
PushButtonGet=new QPushButton;
PushButtonLogin->setText(tr("登录"));
PushButtonPut->setText(tr("上传"));
PushButtonGet->setText(tr("下载"));

LineEditServer=new QLineEdit;
QHBoxLayout *layout1=new QHBoxLayout;
layout1->addWidget(LabelServer);
layout1->addWidget(LineEditServer);

LineEditUser=new QLineEdit;
QHBoxLayout *layout2=new QHBoxLayout;
layout2->addWidget(LabelUser);
layout2->addWidget(LineEditUser);

LineEditPassword=new QLineEdit;
QHBoxLayout *layout3=new QHBoxLayout;
layout3->addWidget(LabelPassword);
layout3->addWidget(LineEditPassword);

QHBoxLayout *layout4=new QHBoxLayout;
layout4->addWidget(PushButtonPut);
layout4->addWidget(PushButtonGet);

QVBoxLayout *mainlayout=new QVBoxLayout;
mainlayout->addLayout(layout1);
mainlayout->addLayout(layout2);
mainlayout->addLayout(layout3);
mainlayout->addWidget(PushButtonLogin);
mainlayout->addLayout(layout4);
setLayout(mainlayout);
PushButtonPut->setEnabled(false);
PushButtonGet->setEnabled(false);
connect(PushButtonLogin,SIGNAL(clicked()),this,SLOT(slotLogin()));
connect(PushButtonPut,SIGNAL(clicked()),this,SLOT(slotPut()));
connect(PushButtonGet,SIGNAL(clicked()),this,SLOT(slotGet()));
}

FtpClient::~FtpClient()
{
delete ui;
}

void FtpClient::slotLogin()
{
QString serverAddress = LineEditServer->text();
if(serverAddress.isEmpty())
{
QMessageBox::warning(this,tr("error"),tr("Please input server address!"));
return;
}
QString userName=LineEditUser->text();
if(userName.isEmpty())
{
QMessageBox::warning(this,tr("error"),tr("Please input user name!"));
return;
}
QString password=LineEditPassword->text();
ftpClient=new QFtp();
ftpClient->connectToHost(serverAddress);

connect(ftpClient,SIGNAL(stateChanged(int)),this,SLOT(slotStateChanged(int)));
connect(ftpClient,SIGNAL(done(bool)),this,SLOT(slotDone(bool)));

ftpClient->login(userName,password);
curStatus=LOGIN;
}

void FtpClient::slotStateChanged(int state)
{
if(state==QFtp::LoggedIn)
{
PushButtonPut->setEnabled(true);
PushButtonGet->setEnabled(true);
}
}

void FtpClient::slotPut()
{
bool ok;
QString fileName=QInputDialog::getText(this,tr("Put File:"),
tr("Please input file name:"),QLineEdit::Normal,QString(),&ok);
if(ok&&!fileName.isEmpty())
{
QFile *remoteFileName=new QFile(fileName);
ftpClient->put(remoteFileName,fileName);
// QFile *dataFile=new QFile("filename");
// dataFile->open(QIODevice::ReadOnly);
// ftpClient->put(dataFile,"filename");
}
curStatus=PUT;
}

void FtpClient::slotGet()
{
bool ok;
QString fileName=QInputDialog::getText(this,tr("Get File:"),
tr("Please input file name:"),QLineEdit::Normal,QString(),&ok);
if(ok&&!fileName.isEmpty())
{
localFile=new QFile(fileName);
localFile->open(QIODevice::WriteOnly);
ftpClient->get(fileName,localFile);
}
curStatus=GET;
}

void FtpClient::slotDone(bool error)
{
if(error)
{
QMessageBox::warning(this,tr("error"),ftpClient->errorString());
return;
}
if(curStatus==LOGIN)
{
PushButtonLogin->setEnabled(false);
curStatus=None;
}
if(curStatus==PUT)
{
QMessageBox::warning(this,tr("succeed"),tr("Put file succeed!"));
curStatus=None;
}
if(curStatus==GET)
{
localFile->close();
QMessageBox::warning(this,tr("succeed"),tr("Get file succeed!"));
curStatus=None;
}
}


最主要的问题是,上传文件的函数slotPut(),无论怎样都上传不了文件。在工程文件夹下随便一个记事本,上传时写这记事本的文件名也上传不了。难道Qt写文件上传不能像php一样一个<input type="file">就有一个控件能点,浏览整个计算机的文件后选择一个文件上传?

还有,下载那块是能下载,但却是直接下载到工程文件夹下的,也不能选择下载到具体电脑的哪个位置。应该是put()和get()函数只能这样吧?能用别的函数吗?

求具体实例代码啊~~
...全文
972 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
水军总督 2013-04-10
  • 打赏
  • 举报
回复
引用 3 楼 dext 的回复:
\examples\network\qftp 下 不是有一个 FTP 的例子么? 你提问题的时间,大家都下班了。你也得让Qter 休息一下吧。
版主你的工作是和Qt有关的吗??做什么的?上位机?嵌入式软件?
dext 2013-04-09
  • 打赏
  • 举报
回复
\examples\network\qftp 下 不是有一个 FTP 的例子么? 你提问题的时间,大家都下班了。你也得让Qter 休息一下吧。
水军总督 2013-04-09
  • 打赏
  • 举报
回复
还真没人顶帖啊。。。
水军总督 2013-04-09
  • 打赏
  • 举报
回复
自己顶一个。。Qt版块的人不至于对ftp没了解吧??

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧