//string#include // cout#include #include FileSetDialog::FileSetDialog(QWidget *parent): ._ui->buttonbox->button(qdialogbu">
当前位置:   article > 正文

QT 实现选择文件并上传显示进度条,tcp传输_ui->buttonbox->button(qdialogbuttonbox::cancel)->s

ui->buttonbox->button(qdialogbuttonbox::cancel)->settext("关闭");

 Qt 实现选择文件 上传,进度条,客户端 .cpp:

  1. #include "filesetdialog.h"
  2. #include "ui_filesetdialog.h"
  3. #include <string> //string
  4. #include <iostream> // cout
  5. #include <QString>
  6. #include <QTextCodec>
  7. FileSetDialog::FileSetDialog(QWidget *parent): QDialog(parent),
  8. ui(new Ui::FileSetDialog)
  9. {
  10. ui->setupUi(this);
  11. this->initTCP();
  12. //文件传送相关变量初始化
  13. //文件传送相关变量初始化
  14. perDataSize = 64 * 1024;
  15. totalBytes = 0;
  16. bytestoWrite = 0;
  17. bytesWritten = 0;
  18. bytesReceived = 0;
  19. filenameSize = 0;
  20. ui->buttonBox->button(QDialogButtonBox::Cancel)->setText("关闭");
  21. connect(this->ui->pushButton_openFile, SIGNAL(clicked()), this, SLOT(selectFile()));
  22. connect(this->ui->pushButton_sendFile, SIGNAL(clicked()), this, SLOT(sendFile()));
  23. }
  24. FileSetDialog::~FileSetDialog()
  25. {
  26. delete ui;
  27. }
  28. void FileSetDialog::initTCP()
  29. {
  30. this->tcpSocket = new QTcpSocket(this);
  31. }
  32. void FileSetDialog::disconnectServer()
  33. {
  34. }
  35. void FileSetDialog::selectFile()
  36. {
  37. this->fileSocket = new QTcpSocket(this);
  38. fileSocket->abort();
  39. fileSocket->connectToHost("127.0.0.1", 8888);
  40. // 文件传送进度条更新
  41. connect(fileSocket, SIGNAL(bytesWritten(qint64)), this, SLOT(updateFileProgress(qint64)));
  42. this->ui->progressBar->setValue(0);
  43. this->filename = QFileDialog::getOpenFileName(this, "Open a file", "/", "files (*)");
  44. ui->lineEdit_filename->setText(filename);//文件名
  45. }
  46. void FileSetDialog::sendFile()
  47. {
  48. this->localFile = new QFile(filename);
  49. if (!localFile->open(QFile::ReadOnly))
  50. {
  51. ui->textEdit->setText(tr("FileSetDialog:open file error!"));
  52. return;
  53. }
  54. // 获取文件大小
  55. this->totalBytes = localFile->size();
  56. // qDebug() << "this->totalBytes====" << this->totalBytes;
  57. //QByteArray t = localFile->readAll();//获取文件内容展示出来
  58. //ui->textEdit->setText(QString(t));
  59. QDataStream sendout(&outBlock, QIODevice::WriteOnly);
  60. sendout.setVersion(QDataStream::Qt_4_8);
  61. QString currentFileName = filename.right(filename.size() - filename.lastIndexOf('/') - 1);
  62. qDebug() << sizeof(currentFileName);
  63. // 保留总代大小信息空间、文件名大小信息空间、文件名
  64. sendout << qint64(0) << qint64(0) << currentFileName;
  65. totalBytes += outBlock.size();
  66. sendout.device()->seek(0);
  67. sendout << totalBytes << qint64((outBlock.size() - sizeof(qint64)* 2));
  68. bytestoWrite = totalBytes - fileSocket->write(outBlock);
  69. outBlock.resize(0);
  70. }
  71. void FileSetDialog::updateFileProgress(qint64 numBytes)
  72. {
  73. // 已经发送的数据大小
  74. bytesWritten += (int)numBytes;
  75. // 如果已经发送了数据
  76. if (bytestoWrite > 0)
  77. {
  78. outBlock = localFile->read(qMin(bytestoWrite, perDataSize));
  79. // 发送完一次数据后还剩余数据的大小
  80. bytestoWrite -= ((int)fileSocket->write(outBlock));
  81. // 清空发送缓冲区
  82. outBlock.resize(0);
  83. }
  84. else
  85. localFile->close();
  86. // qDebug() << "totalBytes==" << totalBytes << "bytesWritten== " << bytesWritten;
  87. // 更新进度条
  88. this->ui->progressBar->setMaximum(totalBytes);
  89. this->ui->progressBar->setValue(bytesWritten);
  90. // 如果发送完毕
  91. if (bytesWritten >= totalBytes)
  92. {
  93. localFile->close();
  94. disconnect(fileSocket, SIGNAL(bytesWritten(qint64)), this, SLOT(updateFileProgress(qint64)));
  95. delete localFile;
  96. bytesWritten = 0;
  97. //fileSocket->close();
  98. }
  99. }

.h:

  1. #ifndef FILESETDIALOG_H
  2. #define FILESETDIALOG_H
  3. #include <QDialog>
  4. #include <QtWidgets/QWidget>
  5. #include <QtNetwork>
  6. #include <QHostAddress>
  7. #include <QMessageBox>
  8. #include <QDataStream>
  9. #include <QByteArray>
  10. #include <QDebug>
  11. #include <QDateTime>
  12. #include <QFile>
  13. #include <QFileDialog>
  14. #include <QAbstractButton>
  15. namespace Ui {
  16. class FileSetDialog;
  17. }
  18. class FileSetDialog : public QDialog
  19. {
  20. Q_OBJECT
  21. public:
  22. explicit FileSetDialog(QWidget *parent = nullptr);
  23. ~FileSetDialog();
  24. void initTCP();
  25. void newConnect();
  26. private slots:
  27. // 与服务器断开连接
  28. void disconnectServer();
  29. // 浏览文件
  30. void selectFile();
  31. // 发送文件
  32. void sendFile();
  33. // 更新文件发送进度
  34. void updateFileProgress(qint64);
  35. private:
  36. Ui::FileSetDialog *ui;
  37. QTcpSocket *tcpSocket;
  38. QTcpSocket *fileSocket;
  39. // 文件传送
  40. QFile *localFile;
  41. // 文件大小
  42. qint64 totalBytes; //文件总字节数
  43. qint64 bytesWritten; //已发送的字节数
  44. qint64 bytestoWrite; //尚未发送的字节数
  45. qint64 filenameSize; //文件名字的字节数
  46. qint64 bytesReceived; //接收的字节数
  47. ///每次发送数据大小
  48. qint64 perDataSize;
  49. QString filename;
  50. ///数据缓冲区
  51. QByteArray inBlock;
  52. QByteArray outBlock;
  53. QString selectPath ="";
  54. };
  55. #endif // FILESETDIALOG_H

服务端:

.cpp:

  1. #include "filemanagment.h"
  2. #include <QDataStream>
  3. #include <QMessageBox>
  4. #include <QString>
  5. #include <QByteArray>
  6. #include <QApplication>
  7. #include <QTextCodec>
  8. FileManagment * FileManagment::widget=nullptr;
  9. FileManagment::FileManagment(QWidget *parent) : QWidget(parent)
  10. {
  11. // 文件传送套接字
  12. this->filesocket = new QTcpSocket(this);
  13. this->fileserver = new QTcpServer(this);
  14. this->fileserver->listen(QHostAddress::Any,8888);
  15. connect(this->fileserver,SIGNAL(newConnection()),this,SLOT(acceptFileConnection()));
  16. // 文件传送相关变量初始化
  17. bytesReceived = 0;
  18. totalBytes = 0;
  19. filenameSize = 0;
  20. }
  21. FileManagment *FileManagment::getFileManagment()
  22. {
  23. if(widget==nullptr)
  24. {
  25. widget = new FileManagment();
  26. }
  27. return widget;
  28. }
  29. FileManagment::~FileManagment()
  30. {
  31. close();
  32. // delete m_sever;
  33. }
  34. void FileManagment::acceptFileConnection()
  35. {
  36. bytesWritten = 0;
  37. //每次发送数据大小为64kb
  38. perDataSize = 64*1024;
  39. this->filesocket = this->fileserver->nextPendingConnection();
  40. //接受文件
  41. connect(filesocket,SIGNAL(readyRead()),this,SLOT(updateFileProgress()));
  42. connect(filesocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(updateFileProgress(qint64)));
  43. connect(filesocket,SIGNAL(bytesWritten(qint64)),this,SLOT(displayError(QAbstractSocket::SocketError socketError)));
  44. qDebug() << "acceptFileConnection ";
  45. }
  46. void FileManagment::updateFileProgress()
  47. {
  48. QDataStream inFile(this->filesocket);
  49. inFile.setVersion(QDataStream::Qt_4_8);
  50. //如果接收到的数据小于16个字节,保存到来的文件头结构
  51. if(bytesReceived <= sizeof(qint64)*2)
  52. {
  53. if((filesocket->bytesAvailable()>=(sizeof(qint64))*2) && (filenameSize==0))
  54. {
  55. inFile>>totalBytes>>filenameSize;
  56. bytesReceived += sizeof(qint64)*2;
  57. }
  58. if((filesocket->bytesAvailable()>=filenameSize) && (filenameSize != 0))
  59. {
  60. inFile>>filename;
  61. bytesReceived += filenameSize;
  62. //创建同名文件
  63. QString filePath = QApplication::applicationDirPath() + "/../../S_Video_v3/fileData";
  64. qDebug() << " 文件夹filePath!" << filePath;
  65. QDir dir(filePath);
  66. // QDir *temp = new QDir;
  67. bool exist = dir.exists(filePath);
  68. if(exist)
  69. qDebug() << "文件夹已经存在!";
  70. else
  71. {
  72. bool ok = dir.mkdir(filePath);
  73. if( ok )
  74. qDebug() << "文件夹不存在,创建成功!";
  75. }
  76. filePath = dir.absolutePath() + QString("/%1").arg(filename);
  77. localFile = new QFile(filePath);
  78. // // 接收的文件放在指定目录下
  79. // filename = "ClientData/"+filename;
  80. // localFile = new QFile(filename);
  81. if(!localFile->open(QFile::WriteOnly))
  82. {
  83. qDebug()<<"Server::open file error!";
  84. return;
  85. }
  86. }
  87. else
  88. return;
  89. }
  90. // /如果接收的数据小于总数据,则写入文件
  91. if(bytesReceived < totalBytes)
  92. {
  93. bytesReceived += filesocket->bytesAvailable();
  94. inBlock = filesocket->readAll();
  95. localFile->write(inBlock);
  96. inBlock.resize(0);
  97. }
  98. // 数据接收完成时
  99. if(bytesReceived == totalBytes)
  100. {
  101. // this->ui.browser->append("Receive file successfully!");
  102. bytesReceived = 0;
  103. totalBytes = 0;
  104. filenameSize = 0;
  105. localFile->close();
  106. //filesocket->close();
  107. }
  108. }
  109. void FileManagment::displayError(QAbstractSocket::SocketError socketError)
  110. {
  111. qDebug()<< "displayError--" << socket->errorString();
  112. socket->close();
  113. }

 .h:

  1. #ifndef FILEMANAGMENT_H
  2. #define FILEMANAGMENT_H
  3. #include <QString>
  4. #include <QDebug>
  5. #include <QTcpServer>
  6. #include <QTcpSocket>
  7. #include <QWidget>
  8. #include <QProcess>
  9. #include <iostream>
  10. #include <QThread>
  11. using namespace std;
  12. class FileManagment: public QWidget
  13. {
  14. Q_OBJECT
  15. public:
  16. explicit FileManagment(QWidget *parent = nullptr);
  17. ~FileManagment();
  18. static FileManagment * getFileManagment();
  19. QTcpServer *server;
  20. QTcpSocket *socket;
  21. QTcpServer *fileserver;
  22. QTcpSocket *filesocket;
  23. private slots:
  24. void acceptFileConnection();
  25. void updateFileProgress();
  26. void displayError(QAbstractSocket::SocketError socketError);
  27. private:
  28. static FileManagment *widget;
  29. // 传送文件相关变量
  30. qint64 totalBytes;
  31. qint64 bytesReceived;
  32. qint64 bytestoWrite;
  33. qint64 bytesWritten;
  34. qint64 filenameSize;
  35. QString filename;
  36. ///每次发送数据大小
  37. qint64 perDataSize;
  38. QFile *localFile;
  39. // 本地缓冲区
  40. QByteArray inBlock;
  41. QByteArray outBlock;
  42. };
  43. #endif // FILEMANAGMENT_H

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/264367
推荐阅读
相关标签