用QNetworkAccessManager对接linux的vsftp上传,发现两个问题,1、创建文件夹失败。2、中文文件上传失败,这个问题就是编码不一致造成的,网上搜了很多最后终于解决。
解决方案:
1、创建文件夹失败:
linux的selinux禁用,禁用方法如下图。
![](https://i-blog.csdnimg.cn/blog_migrate/f721dda3a88f866d7640ee2af0d7f284.png)
中文文件上传你失败,原因客户端的编码方式和服务端的编码方式不一致,我客户端用的是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);
}