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

利用   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服务器。



                
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值