利用 QNetworkAccessManager 实现Ftp上传功能,网上有很多demo,这里要说的是,上传的时候不含中文汉字的文件名称 还好一切OK!如果你上传的是中文名称的文件,那就会出问题了。
查了很多资料,Qurl含有中文路径的解决办法,网上的答案出奇的一致,试了很多都不行,其实原因也不难,就是编码原因。
不说了直接上代码。
void Widget::on_pushButton_2_clicked()
{
QTextCodec *codec= QTextCodec::codecForName("gbk"); //这个必须设置 根据系统编码设置下
QStringList pushlist = QFileDialog::getOpenFileNames(this, tr("Open File"), "C:\\Users\\Administrator\\Desktop", tr("video(*.mp4);; png(*png);;jpg(*jpg);;gif(*gif)"));
if(pushlist.length() == 0)
{
return;
} //打开文件选择器 选择上传文件。
qDebug()<<"filenamePath..........."<<pushlist.at(0);
QString filenamePath = pushlist.at(0);
QStringList list = filenamePath.split("/");
QString fileName = list.at(list.length() -1);
QFile txt1(filenamePath);
txt1.open(QIODevice::ReadOnly);
qDebug()<< "file open is" <<txt1.isOpen();
QByteArray by_txt=txt1.readAll();
txt1.close();
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QString str1 = "ftp://192.168.2.19/t/";
QString name = QString::fromLatin1(codec->fromUnicode(fileName)); //这一一句是关键,实现转码,记住,只对文件名 //称进行转码.
// QString name = QString::fromLatin1(fileName.toLocal8Bit()); //转码
QUrl URL = QUrl(str1 +name);
URL.setUserName("ms");
URL.setPassword("0p-0p-0p-");
// u.setPort(21)
QNetworkRequest PutRequest;
PutRequest.setUrl(URL);
QNetworkReply *putReply = manager->put(PutRequest, by_txt);
connect(putReply, SIGNAL(finished()), this, SLOT(slotFinished()));
connect(putReply, SIGNAL(uploadProgress(qint64,qint64)),this,SLOT(uploadProgress(qint64,qint64)));
connect(putReply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(slotError(QNetworkReply::NetworkError )));
}// 更新进度条
void Widget::uploadProgress(qint64 bytesSent, qint64 bytesTotal)
{
qDebug()<<"bytesTotal >>>> bytesSent.... "<<bytesTotal<<bytesSent;
ui->progressBar->setMaximum(bytesTotal);
ui->progressBar->setValue(bytesSent);
}
//出错函数
void Widget::slotError(QNetworkReply::NetworkError erro)
{
QNetworkReply *reply = (QNetworkReply *)sender();
if(reply->error() == erro)
{
qDebug()<<"error!!!!!!!!!!!!!!!!!!" <<QString::fromUtf8(reply->readAll());
}
}//传输完成函数
void Widget::slotFinished()
{
QNetworkReply *reply = (QNetworkReply *)sender();
if(reply->error() == QNetworkReply::NoError)
{
qDebug()<<"Succed!";
}
else
{
qDebug()<<"Check & Retry!!!!!!!";
}
}选择一个“三国演义.mp4”文件到Ftp服务器。