Qt使用post上傳壓縮檔案
阿新 • • 發佈:2019-01-02
在專案中需要將本地的一個資料夾上傳到伺服器,於是想到先將起壓縮成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
}