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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章