QtHttp上传文件

QtHttp文件上传到服务器

文件上传到服务器在Qt客户端开发的过程中,比较常见。简单封装了一下,复制下来头文件声明一下,就可以直接使用了。
一般来说,不会就单单上传一个文件,前面会带着几个普通字段。代码中,我用FileID做了一个例子。

//包含的头文件混了,自行分辨一下
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QEventLoop>
#include <QHttpPart>

//直接复制过去,在头文件里面声明一下就能用
bool HttpPostFileUpload(const QString p_sUploadDirPath/*文件路径*/, QString &p_sReturnData/*返回数据*/)
{
    //网络请求对象
    QNetworkRequest request;
    //网络请求地址
    QString sRequestUrl = "www.xxxx.xx";
    request.setUrl(QUrl(sRequestUrl));
    // 发送的数据
    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    
    // 普通字段
    QHttpPart FileID;
    FileID.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"001\""));
    FileID.setBody(QString("xxxx").toLatin1());
    multiPart->append(FileID);
    
    // 文件
    QFileInfo fileInfo(p_sUploadDirPath);
    QFile *pFile = new QFile(p_sUploadDirPath);
    if(!pFile->open(QIODevice::ReadOnly))
    {
        qDebug() << "文件" + p_sUploadDirPath + "打开失败";
    }
    pFile->setParent(multiPart); //给pFile设置parent,pFile就不需要再delete了
    QHttpPart filePart;
    filePart.setBodyDevice(pFile);
    filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
    QString requestFormat = QString::fromUtf8("form-data;name=%1;filename=%2;")
            .arg("file")
            .arg(fileInfo.fileName());
    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(requestFormat));
    multiPart->append(filePart);
    
    // 网络请求
    QNetworkAccessManager *accessManager = new QNetworkAccessManager();
    QNetworkReply *reply = accessManager->post(request, multiPart);
    multiPart->setParent(reply); // multiPart不需要delete了
    //事件循环
    QEventLoop eventLoop;
    QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
    // 获取返回的数据
    p_sReturnData = QString(reply->readAll());
    qDebug() << "返回参数:" << p_sReturnData ;

    pFile->close();
    reply->abort();
    accessManager->deleteLater();//不主动释放会在卸载DLL时造成耗时
    accessManager=NULL;
    return true;
}

有问题请留言,不忙的时候会看。

点赞、收藏、关注!!日常更新!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值