开发环境:Ubuntu16.04 64bit +Qt5.8.0
在使用Qt5中的QNetworkAccessManager 类进行Http的发送数据时,可使用QByteArray 作为post(manager,QByteArray )的第二个参数进行发送文本类字符串。 但是发送图片文件时,并不能简单的把图片文件数据读出来,赋值给QByteArray 来进行发送,这样发送图片文件不会成功。
QNetworkReply *post(const QNetworkRequest &request, QIODevice *data); QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data); QNetworkReply *post(const QNetworkRequest &request, QHttpMultiPart *multiPart);经查,post函数有3个。 所以使用新的类QHttpMultiPart,来对图片文件进行数据组装,在进行post发送。
//头文件h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QtNetwork> #include <QDebug> #include <QString> #include <QVariant> #include <QHttpMultiPart> #include <QFile> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); public slots: void replyFinished(QNetworkReply *reply); private: Ui::MainWindow *ui; QString baseUrl ; QByteArray dataArray ; QNetworkRequest request; QNetworkAccessManager *manager ; QVariant variant ; }; #endif // MAINWINDOW_H//源文件cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <unistd.h> #include <QTextCodec> #include <QColor> #include <stdio.h> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //设置程序编码格式为utf-8 QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); //构造manager manager = new QNetworkAccessManager(this); // 连接信号槽 connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *))); //我的图片文件 QString path = "./1024.jpg"; //构造multiPart ,用来组装图片数据 QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart imagePart; //经测试,设置此content-type,并不是必须。我测试的为jpg文件,则是image/jpeg,其他的格式文件查找http状态码,或者查找HTTP content-type imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg")); QString filename = "1024.jpg"; //此ContentDispositionHeader参数极为重要,如果不对,则发送图片不成功,name可以随意起名字,但是filename则必须是你要上传的文件名。 imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QString("form-data; name=\"%1\"; filename=\"%2\"").arg("f1").arg(filename)); QFile *file = new QFile(path); file->open(QIODevice::ReadOnly); //依照下面方式将图片文件的内容附着于multiPart上, imagePart.setBodyDevice(file); file->setParent(multiPart); multiPart->append(imagePart); //此处设置上传的url QNetworkRequest request(QUrl("http://192.168.1.100/api/program/led_display.vsn")); //发送post manager->post(request, multiPart); } //返回帧数据接收 void MainWindow::replyFinished(QNetworkReply *reply) { //1、获取响应状态码 variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); if (variant.isValid()) { qDebug() << variant.toInt(); } //2、获取响应头 variant = reply->header(QNetworkRequest::ContentTypeHeader); if (variant.isValid()) qDebug() << variant.toString(); //3、获取响应信息 QByteArray bytes = reply->readAll(); qDebug() << bytes ; ui->textBrowser->append(bytes); }经测试有效,其他方法未测试,如有高手,欢迎交流。
注:转载请注明出处。QQQQ