开发环境: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
版权声明:本文为qianqiaoqianqi原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。