1. 程式人生 > >Qt使用post上傳壓縮檔案

Qt使用post上傳壓縮檔案

在專案中需要將本地的一個資料夾上傳到伺服器,於是想到先將起壓縮成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 }