Qt使用post上传压缩文件

来源:互联网 发布:java浅蓝色代码 编辑:程序博客网 时间:2024/06/04 20:03

在项目中需要将本地的一个文件夹上传到服务器,于是想到先将起压缩成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}
1 0
原创粉丝点击