在項目中需要將本地的一個文件夾上傳到服務器,於是想到先將起壓縮成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
}