传统通过 HTTP 表单的方式来上传文件在 Web 中实现是非常简单的,一个表单中加几个域填写上对应的内容提交就可以了,但如果通过 Qt 来实现就相对麻烦一点,不过我都总结好了代码,直接使用就可以了。
需要用到的模块
- QNetworkAccessManager 用来发起 GET/POST 请求
- QNetworkReply 用来描述响应信息
- QHttpMultiPart 用来模拟表单域
- QNetworkRequest 用来构建请求地址等信息
Qt 官方简单例子
Qt 官方基于 QHttpMultiPart
的简单例子:https://doc.qt.io/archives/qt-4.8/qhttpmultipart.html
1 | QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); |
封装后的类
头文件:
1 | #ifndef HTTPUP_LOADER_H |
实现文件
1 | #include <QFile> |
外部调用时,像下面这样调用就可以了
1 | HttpUploader* uploader_ = new HttpUploader(report_url_, this); |
在 new 上传对象的指针时,第二个传递的参数是当前类的一个指针,你需要实现 onNetworkFinished
,onReplyFinished
,onUploadProgress
,来监视上传任务的进度和完成信息,当然你可以自己封装一下,上传对象仅仅提供信号,需要时在外部 connect 就可以了。onNetworkFinished 和 onReplyFinished 的区别是,onReplyFinished 槽函数对应 QNetworkReply 的 finished 信号,他仅仅通知完成了,不会携带任何参数。但是你可以通过 QNetworkReply 的实例对象来获取各种返回值信息。而 onNetworkFinished 槽函数对应的是 QNetworkAccessManager 的 finished 信号,其会携带一个 QNetworkReply 对象指针,你只需要在这里处理返回的对应错误码就可以了。
返回值处理
我使用 QNetworkAccessManager 的 finished 信号来接收完成事件,在 onNetworkFinished 函数中,我们接收到的信息是一个 reply 对象。你可以通过 reply 对象获取 HTTP 返回值:
1 | QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); |
也可以打印 Qt 自由的一套返错误代码
1 | qDebug() << reply->error(); |
如果没有错误的情况下,你可以使用 reply 对象获取返回的内容:
1 | qDebug() << reply->readAll(); |