【Qt 学习之路】QTcpSocket发送图片(或大文件)Demo

31 篇文章 0 订阅
24 篇文章 1 订阅

先看一下效果:

思路:

发图片、大文件与发短字符不大一样。

1、文件和图片通过TCP可能一次发不过去,可能要发很多次。所以我们在发送文件、数据、以及文字最好带上文件的大小。

2、图片转换成文件流的形式,这个Demo是转成base64加密流

核心代码:

1、tcp客户端与服务端的代码这里就不贴了,以前贴过,可以看我以前的帖子。这里贴一下思路代码:

发送图片端:

        QByteArray byte = "P" + QByteArray::number(m_base64.length()) + "P";
        m_tcpClient->sendMessageB(byte);
        qDebug() << "len" << byte;
        m_tcpClient->sendMessageB(m_base64);

这里的“P”只是一个分隔符,可以自定义。m_base64是图片转换成的QByteArray。

看一下接收图片端:

    QByteArray tmp = m_socket->readAll();
    if(m_dataLength != 0) {
        m_byte.append(tmp);
        m_dataLength = m_dataLength - tmp.length();
        qDebug() << "m_dataLength " << m_dataLength;
        if(m_dataLength == 0) {
            emit alreadyRead();
        }
    } else {
        int len;
        if(tmp.contains("P")) {
            m_type = "P";
            len = tmp.split('P').at(1).toInt();
        } else if(tmp.contains("T")){
            m_type = "T";
            len = tmp.split('T').at(1).toInt();
        }
        int preNum = 2 + QString::number(len).count();
        m_dataLength = len + preNum - tmp.length();
        m_byte.clear();
        m_byte = tmp.mid(preNum, tmp.count() - preNum);
    }

2、图片转换成文字流的代码:

#ifndef SBASE64TOIMAGE_H
#define SBASE64TOIMAGE_H

#include <QByteArray>
#include <QBuffer>
#include <QImage>
#include <QPixmap>

class SBase64ToImage : public QObject
{
    Q_OBJECT
public:
    static QByteArray Image_To_Base64(QString ImgPath) {
        QImage image(ImgPath);
        QByteArray ba;
        QBuffer buf(&ba);
        image.save(&buf,"PNG",20);
        QByteArray hexed = ba.toBase64();
        buf.close();
        return hexed;
    }
    static QPixmap Base64_To_Image(QByteArray bytearray) {
        QByteArray Ret_bytearray = QByteArray::fromBase64(bytearray);
        QBuffer buffer(&Ret_bytearray);
        buffer.open(QIODevice::WriteOnly);
        QPixmap imageresult;
        imageresult.loadFromData(Ret_bytearray);
        return imageresult;
    }
};
#endif // SBASE64TOIMAGE_H

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙振宇

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值