qt对接vsftp过程中中文乱码解决方案

用QNetworkAccessManager对接linux的vsftp上传,发现两个问题,1、创建文件夹失败。2、中文文件上传失败,这个问题就是编码不一致造成的,网上搜了很多最后终于解决。

解决方案:

1、创建文件夹失败:

linux的selinux禁用,禁用方法如下图。

  1. 中文文件上传你失败,原因客户端的编码方式和服务端的编码方式不一致,我客户端用的是utf-8,但是服务端没有开启utf-8,要给vsftp发送命令 OPTS UTF8 ON,解决。至于怎么发送这个命令,可以用filezilla上传一个中文文件,让他替你开启服务端的这个开关。我是使用windows的系统函数解决,代码如下。其中包括了创建目录功能。开启函数就一行FtpCommand(hftp,false, FTP_TRANSFER_TYPE_ASCII,L"OPTS UTF8 ON",NULL,NULL);

void FtpUpload::FtpMKdir(wstring desFilePath)
{
    //如果目的路径不存在,一级一级创建
    //目的路径格式为:"./dir/dir1/.../"
    int pos = 1;
    wstring tempPath;
    do 
    {
        HINTERNET hint = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
        if (hint == NULL)
        {
            break;
        }
        //创建ftp连接
        HINTERNET hftp = InternetConnect(hint,m_uploadInfo.ftpSvrIp.toStdWString().c_str(), m_uploadInfo.iPort, m_uploadInfo.usr.toStdWString().c_str(), m_uploadInfo.pwd.toStdWString().c_str(), INTERNET_SERVICE_FTP, 0, 0);
        if (hftp == NULL)
        {
            break;
        }

        while (pos > 0)
        {
            // 从第二个“/”开始依次找到目的路径中的“/”位置
            pos = desFilePath.find_first_of('/', pos + 1);
            if (pos == -1)
                break;
            tempPath = desFilePath.substr(0, pos + 1);
            if (_waccess(tempPath.c_str(), 0) == -1)
            {
                FtpCreateDirectory(hftp, tempPath.c_str());
            }
            FtpCommand(hftp,false, FTP_TRANSFER_TYPE_ASCII,L"OPTS UTF8 ON",NULL,NULL);
        }
        InternetCloseHandle(hftp);
        InternetCloseHandle(hint);
    } while (0);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值