一.前言
楼主在之前的文章中讲述了传输文件的思路,但那只是单个文件的思路,实际使用中,会有传输多文件的需求,楼主就此做个记录分享
以往文章:
Qt笔记(七十)之QWebSocket传输文件 进度条显示
二.实现过程
1.思路:选择多个文件 记录文件个数 循环传输文件,需要注意的是,传输完一个文件后,可能需要给服务器一个缓冲时间去保存为上传的文件
2.代码实现,客户端代码,服务端不用动
void ClientWidget::on_pushButton_1_clicked()
{
qDebug()<<"开始新连接";
ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":开始连接");
QString urlStr = QString("ws://%1").arg(ui->lineEdit->text());
webSocket.open(QUrl(urlStr));
}
void ClientWidget::on_pushButton_2_clicked()
{
webSocket.close();
}
void ClientWidget::on_pushButton_3_clicked()
{
ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":给服务端发消息:"+ui->textEdit_1->toPlainText());
QString msg = ui->textEdit_1->document()->toPlainText();
webSocket.sendTextMessage(msg);
}
void ClientWidget::onConnected()
{
ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":正确连接上了服务端");
}
void ClientWidget::onDisconnected()
{
ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":断开连接");
}
void ClientWidget::onTextMessageReceived(QString msg)
{
qDebug()<<msg;
ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":服务端发来消息:"+msg);
}
void ClientWidget::on_pushButton_4_clicked()
{
sendMutliFile();
return;
qDebug()<<"选择文件,并发送";
QString sendFile = QFileDialog::getOpenFileName(this,QStringLiteral("选择发送文件"),"C://","TEXT(*.txt)");
if(sendFile.isEmpty())
return;
// 先发送文件名,可以先裁剪剩下文件名,楼主为了方便,直接发送文件路径
webSocket.sendTextMessage("send_file_name:"+sendFile);
// 开始读取文件内容
QFile file(sendFile);
if(!file.open(QIODevice::ReadOnly))
return;
// 发送文件传输开始标志
webSocket.sendTextMessage("send_start");
// 读取文件
QByteArray data = file.readAll();
// 设置进度条属性
int MAX_BYTE=20; // 定义一次传输最大字节
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(data.length()%MAX_BYTE==0?data.length()/MAX_BYTE:data.length()/MAX_BYTE+1);
ui->progressBar->setValue(0);
int idx=0;
for(int i=0;i<data.length();i+=MAX_BYTE)
{
webSocket.sendBinaryMessage(data.mid(i,MAX_BYTE));
idx++;
// 更新进度条
ui->progressBar->setValue(idx);
mySleep(500); // y延迟500ms 凸显进度条效果
}
// webSocket.sendBinaryMessage(data);
file.close();
// 发送文件传输结束标志
webSocket.sendTextMessage("send_end");
}
void ClientWidget::sendMutliFile()
{
// 复位进度条
ui->progressBar->setValue(0);
ui->progressBar_1->setValue(0);
// 选择多选文件
QStringList sendFileList = QFileDialog::getOpenFileNames(this,"选择发送文件(支持多选)","C:","Text(*.txt)");
if(sendFileList.length()==0)
return;
qDebug()<<sendFileList;
// 设置总进度条属性
ui->progressBar_1->setMinimum(0);
ui->progressBar_1->setMaximum(sendFileList.length());
ui->progressBar_1->setValue(0);
// 开始执行发送多文件
int idx1=0;
for(int num =0;num<sendFileList.count();num++)
{
QString filePath = sendFileList[num];
QFile file(filePath);
if(file.open(QIODevice::ReadOnly))
{
QByteArray ba = file.readAll();
int MAX_BYTE=20; // 定义一次传输最大字节
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(ba.length()%MAX_BYTE==0?ba.length()/MAX_BYTE:ba.length()/MAX_BYTE+1);
ui->progressBar->setValue(0);
webSocket.sendTextMessage("send_start");
int idx=0;
for(int dataNum=0;dataNum<ba.length();dataNum+=MAX_BYTE)
{
webSocket.sendBinaryMessage(ba.mid(dataNum,MAX_BYTE));
idx++;
// 更新进度条
ui->progressBar->setValue(idx);
mySleep(500); // 延迟500ms 凸显进度条效果
}
file.close();
webSocket.sendTextMessage("send_end");
}
else
{
qDebug()<<"发送失败文件:"<<filePath;
continue;
}
idx1++;
ui->progressBar_1->setValue(idx1);
// 给服务器一个缓冲时间
mySleep(500);
}
}
3.效果预览