基本思路
首先建立TCP连接,将图片转化为流的方式进行传输
使用qint64初始化totalBytes(总数据量)、imageBytes(图片数据量)确保在各个平台都占用16字节,imageData是图片的base64格式数据,其大小通过(outBlock.size() - sizeof(qint64)*2)获得
接收端使用同样的变量接收数据,确保每一位都准确收到。
接收代码
QDataStream in(tcpServerConnection);
in.setVersion(QDataStream::Qt_5_15);
//如果接收到的数据小于16个字节,保存到来的文件头结构
if(bytesRecived<=sizeof(qint64)*2)
{
if((tcpServerConnection->bytesAvailable()>=sizeof(qint64)*2)
&& (imageSize==0)){
//接收数据总大小信息和文件名大小信息
in>>totalBytes>>imageSize;
bytesRecived+=sizeof(qint64)*2;
if(imageSize==0){
ui->serverStatusLabel->setText(tr("显示图片为空"));
}
qDebug()<<"定位点0"<<Qt::endl;
}
if((tcpServerConnection->bytesAvailable())>=imageSize
&& imageSize!=0)
{
in>>imageContent;
ui->serverStatusLabel->setText(tr("接收文件 …"));
QImage imageData=getImage(imageContent);
QPixmap resImage=QPixmap::fromImage(imageData);
QPixmap* imgPointer=&resImage;
imgPointer->scaled(ui->imageLabel->size(),Qt::IgnoreAspectRatio);
ui->imageLabel->setScaledContents(true);
ui->imageLabel->setPixmap(*imgPointer);
bytesRecived+=imageSize;
if(bytesRecived==totalBytes){
ui->serverStatusLabel->setText(tr("接收文件成功"));
totalBytes = 0;
bytesRecived = 0;
imageSize = 0;
}
}
}
发送代码
QDataStream sendOut(&outBlock,QIODevice::WriteOnly);
sendOut.setVersion(QDataStream::Qt_5_6);
//获得图片数据
QImage image(fileName);
QString imageData=getImageData(image);
qDebug()<<"fileName: "<<fileName<<endl;
// 保留总大小信息空间、图像大小信息空间,然后输入图像信息
sendOut << qint64(0) << qint64(0) << imageData;
// 这里的总大小是总大小信息、图像大小信息和实际图像信息的总和
totalBytes += outBlock.size();
sendOut.device()->seek(0);//将设备的指针位置设置为0,方便输入数据
// 返回outBolock的开始,用实际的大小信息代替两个qint64(0)空间
sendOut << totalBytes << qint64((outBlock.size() - sizeof(qint64)*2));
//发出readyRead()信号
tcpClient->write(outBlock);
qDebug() << "图片的内容大小: " << qint64((outBlock.size() - sizeof(qint64)*2)) << endl;
qDebug() << "整个包的大小: " << totalBytes << endl;
outBlock.resize(0);
ui->clientStatusLabel->setText(tr("传送文件 %1 成功").arg(currentImageName));
totalBytes = 0;
保存路径:E:\demo\QT\传输图片