QNetworkAccessManager 实现FTP上传功能,解决 文件名是中文,QUrl含有中文路径 不能上传的问题
2016-07-25 15:34
921 查看
利用 QNetworkAccessManager 实现Ftp上传功能,网上有很多demo,这里要说的是,上传的时候不含中文汉字的文件名称 还好一切OK!如果你上传的是中文名称的文件,那就会出问题了。
查了很多资料,Qurl含有中文路径的解决办法,网上的答案出奇的一致,试了很多都不行,其实原因也不难,就是编码原因。
不说了直接上代码。
// 更新进度条
//出错函数
//传输完成函数
选择一个“三国演义.mp4”文件到Ftp服务器。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201607/d8db635290c5c9976d198c136b9a55c1)
查了很多资料,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服务器。
相关文章推荐
- PHP编程效率的要点
- 齐博建站指南
- php ajax 下拉加载数据
- phpStudy集成环境下 安装composer失败
- DTP中语义组的应用
- Laravel:php artisan migrate报错SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default
- 【PHP设计模式】——单例模式
- SMTPS和SMTP
- PHP之Bool类型
- yii2框架-console的cli模式(二十)
- PHP计算当前连续天数
- FTP命令传送文件
- php使用pdo操作数据库时出现ERROR:could not find driver的解决方法
- SMTPS丁丁
- LAMP分离部署
- win下如何在yii框架下面使用sphinx
- 解决php向mysql数据库插入数据乱码问题
- ThinkPHP自定义成功界面、失败界面、异常界面
- MySQLDB.class.php
- PhpExcel中文帮助手册|PhpExcel使用方法