在项目中需要将本地的一个文件夹上传到服务器,于是想到先将起压缩成ZIP文件,然后上传。压缩功能的做法见另一篇博文Qt将文件夹压缩成ZIP文件.
由于经验所限,不太懂网络编程。根据例子,使用 QNetworkAccessManager 和 QNetworkRequest 上传文件内容,总是错误。最后在一些好友的帮助下,终于解决了问题,记下来备忘。也希望给遇到类似问题的同学一个帮助。由于没有弄懂真正的原理和机制,仅贴出代码,给有需要的同学参考。
接口文档说明:
上传实现函数:
把代码也粘上:
void UploadFile_API::sendRequest(const QString &userName, const QString &teacherSession, const QString &zipfile)
{
status = -1;
msg = QStringLiteral("连接超时,请检查您的网络设置。");
//从服务器取得时间戳
UnixTimeAPI unixTimeAPI;
if (!unixTimeAPI.isOK())
{
qWarning()<<Q_FUNC_INFO<<"Obtain UnixTime failed.";
return;
}
//设置发送的数据
uint unixTime_s = unixTimeAPI.getUnixTime_s();
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart signaturePart;
signaturePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("signature")));
signaturePart.setBody(NetworkServerUtil::getSignature(unixTime_s).toLatin1());
QHttpPart utPart;
utPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("unix_time")));
utPart.setBody(QString::number(unixTime_s).toLatin1());
QHttpPart tiPart;
tiPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("teacher_id")));
tiPart.setBody(userName.toLatin1());
QHttpPart tsPart;
tsPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("teacher_session")));
tsPart.setBody(teacherSession.toLatin1());
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"; filename=\"%2\"").arg("zipfile").arg(QFileInfo(zipfile).fileName())));
QFile *file = new QFile(zipfile);
file->open(QIODevice::ReadOnly);
imagePart.setBodyDevice(file);
file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart
multiPart->append(signaturePart);
multiPart->append(utPart);
multiPart->append(tiPart);
multiPart->append(tsPart);
multiPart->append(imagePart);
//设置头信息
QNetworkRequest networkRequest;
networkRequest.setUrl(QUrl(QString("http://%1/tsp/uploadfile").arg(NetworkServerUtil::getStableIP())));
//发送请求
QNetworkReply *networkReply = m_networkManager->post(networkRequest, multiPart);
multiPart->setParent(networkReply); // delete the multiPart with the reply
}