Qt5中使用Http来发送图片

开发环境: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版权协议,转载请附上原文出处链接和本声明。