您的位置:首页 > 编程语言 > PHP开发

QNetworkAccessManager 实现FTP上传功能,解决 文件名是中文,QUrl含有中文路径 不能上传的问题

2016-07-25 15:34 921 查看
利用   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服务器。




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: