先看一下效果:
思路:
发图片、大文件与发短字符不大一样。
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